gpt4 book ai didi

c++ - 使用 boost 波

转载 作者:可可西里 更新时间:2023-11-01 18:29:34 27 4
gpt4 key购买 nike

我正在尝试着手研究 boost wave,但到目前为止,我的运气并不好。

我尝试了网站上的示例代码。如下:

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <vector>

///////////////////////////////////////////////////////////////////////////////
// Include Wave itself
#include <boost/wave.hpp>

///////////////////////////////////////////////////////////////////////////////
// Include the lexer stuff
#include <boost/wave/cpplexer/cpp_lex_token.hpp> // token class
#include <boost/wave/cpplexer/cpp_lex_iterator.hpp> // lexer class

int main () {
// The following preprocesses a given input file.
// Open the file and read it into a string variable
std::ifstream instream("lex_infile");
std::string input(
std::istreambuf_iterator<char>(instream.rdbuf()),
std::istreambuf_iterator<char>());

// The template boost::wave::cpplexer::lex_token<> is the
// token type to be used by the Wave library.
// This token type is one of the central types throughout
// the library, because it is a template parameter to some
// of the public classes and templates and it is returned
// from the iterators.
// The template boost::wave::cpplexer::lex_iterator<> is
// the lexer iterator to use as the token source for the
// preprocessing engine. In this case this is parametrized
// with the token type.
typedef boost::wave::cpplexer::lex_iterator<
boost::wave::cpplexer::lex_token<> >
lex_iterator_type;
typedef boost::wave::context<
std::string::iterator, lex_iterator_type>
context_type;

context_type ctx(input.begin(), input.end(), "lex_infile");

// At this point you may want to set the parameters of the
// preprocessing as include paths and/or predefined macros.
//ctx.add_include_path("...");
//ctx.add_macro_definition(...);

// Get the preprocessor iterators and use them to generate
// the token sequence.
context_type::iterator_type first = ctx.begin();
context_type::iterator_type last = ctx.end();

std::cout << "HERE" << std::endl;

// The input stream is preprocessed for you during iteration
// over [first, last)
while (first != last) {
std::cout << (*first).get_value() << std::endl;
++first;
}
}

它编译正常,但是当我向其中输入文件时,出现以下错误:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'
what(): boost::wave::preprocess_exception
Aborted

我尝试“预处理”的代码位于名为 lex_infile 的文件中,其中包含以下内容:

#include <oglre>
#include <light>
#include <material>

in vec3 in_Position;
in vec2 in_Texture;
in vec3 in_Normal;

out vec2 textureCoord;
out vec4 pass_Color;




void main() {
gl_Position = pvmMatrix * vec4(in_Position, 1.0);

textureCoord = in_Texture;


vec3 normalDirection = normalize(normalMatrix * in_Normal);
vec3 lightDirection = normalize(vec3(lightSources[0].direction));

vec3 diffuseReflection = vec3(lightSources[0].diffuse) * vec3(mymaterial.diffuse) * max(0.0, dot(normalDirection, lightDirection));

/*
float bug = 0.0;
bvec3 result = equal( diffuseReflection, vec3(0.0, 0.0, 0.0) );
if(result[0]) bug = 1.0;

diffuseReflection.x += bug;
*/

pass_Color = vec4(diffuseReflection, 1.0);
}

我想我需要定义包含位置....我该怎么做?

抱歉,如果这是简单的事情,我只是有点迷路。

最佳答案

想通了。

我需要扩展类 public wave::context_policies::default_preprocessing_hooks,然后覆盖方法 found_unknown_directive

完成后,我需要将新的预处理 Hook 类作为模板参数传递到 typedef boost::wave::context 中。

看起来像这样:

typedef boost::wave::context<
std::string::iterator,
lex_iterator_type,
load_file_to_string,
custom_directives_hooks
> context_type;

class custom_directives_hooks
: public wave::context_policies::default_preprocessing_hooks
{
public:

template <typename ContextT, typename ContainerT>
bool
found_unknown_directive(ContextT const& ctx, ContainerT const& line,
ContainerT& pending)
{
typedef typename ContainerT::const_iterator iterator_type;
iterator_type it = line.begin();
wave::token_id id = wave::util::impl::skip_whitespace(it, line.end());

if (id != wave::T_IDENTIFIER)
return false; // nothing we could do

if (it->get_value() == "version" || it->get_value() == "extension") {
// Handle #version and #extension directives
std::copy(line.begin(), line.end(), std::back_inserter(pending));
return true;
}

if (it->get_value() == "type") {
// Handle type directive
return true;
}

// Unknown directive
return false;
}
};

希望对遇到此问题的其他人有所帮助。

关于c++ - 使用 boost 波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14858017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com