glGetShaderInfoLog到std :: string?

时间:2016-10-23 19:19:16

标签: c++ string opengl

这是OpenGL Super Bible第7版的片段:

localdata

乍一看,将add_library(libbozorth3 STATIC ${LIB_SOURCE_FILES}) set_property(TARGET libbozorth3 PROPERTY OUTPUT_NAME bozorth3) target_include_directories(libbozorth3 PRIVATE include) add_executable(bozorth3 ${BIN_SOURCE_FILEs}) target_include_directories(bozorth3 PRIVATE include) target_link_libraries(bozorth3 PRIVATE libbozorth3 commonnbis) 作为一个参数传递给这个函数似乎很奇怪,当然clang立即抗议:GLint log_length; glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &log_length); std::string str; str.reserve(log_length); glGetShaderInfoLog(fs, log_length, NULL, str.c_str());

所以我尝试调查并将str.c_str()更改为cannot initialize a parameter of type 'GLchar *' (aka 'char *') with an rvalue of type 'const char *',它应该提供指向内部数据数组的指针,但这会产生相同的错误消息。 修改: str.c_str()str.data()实际上是相同的事情(至少在c ++ 11中),所以我们使用哪一个并不重要。

我做了一些搜索,但没有找到解决方案(虽然我对C ++很新,有些事情对我来说仍然不明显)。

这是书中的错误吗?有没有办法让它与std :: string一起使用?

1 个答案:

答案 0 :(得分:5)

string::c_str()string::data()都会返回const char*直到C ++ 17。从C ++ 17开始,string::data()的重载将返回char*。这意味着此代码段无效。

编辑:使用&str[0]更简单有效的解决方案。下标运算符将返回char&

如果你不能使用C ++ 17,你可以使用std::vector<char>,它有一个非const data(),但这会在构造std::string时产生一个副本:

// ...
std::vector<char> v(log_length);
glGetShaderInfoLog(fs, log_length, NULL, v.data());
std::string s(begin(v), end(v));

此外,reserve()还不够,因为实际的size()不会更改。如果c_str()返回char*,则该代码段实际上也会导致未定义的行为。