传递char给glShaderSource遇类型转换错误求助
解决glShaderSource中char转const GLchar的类型错误
这个问题我可太熟了!本质是C++的const类型安全机制在起作用——别慌,咱一步步来解决。
为啥会报错?
glShaderSource的第三个参数要求的是const GLchar**类型,但你传递的是char**。C++允许一级指针(比如char*)隐式转成const char*,但二级指针不行,这是为了避免潜在的const安全问题,所以编译器直接给你抛了错误。
几个靠谱的解决办法
1. 强制类型转换(快速解决)
如果确定你的shader源码不会被修改(glShaderSource本来就只是读取源码,不会修改它),可以用C++的reinterpret_cast来强制转换类型:
char *vertexShaderSource = loadShaderFile((char *)"vshader.glsl"); // 这里用reinterpret_cast完成类型转换 glShaderSource(vertexShader, 1, reinterpret_cast<const GLchar**>(&vertexShaderSource), nullptr);
也可以用C风格的强制转换(const GLchar**)&vertexShaderSource,但reinterpret_cast更符合C++的编码规范。
2. 修改函数返回类型(更规范)
既然shader源码不需要被修改,直接把loadShaderFile的返回类型改成const char*,这样取地址后就是const char**,可以隐式转换成const GLchar**(因为GLchar通常就是char的typedef):
// 修改函数声明 const char* loadShaderFile(const char* fileName); // 调用时 const char* vertexShaderSource = loadShaderFile("vshader.glsl"); // 这里不需要额外转换,直接传&vertexShaderSource就行 glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);
这种方式更符合const的语义,代码也更安全。
3. 中间变量过渡(最稳妥)
如果不想修改loadShaderFile的返回类型,可以先把char*赋值给一个const GLchar*的中间变量,再取地址传递:
char *vertexShaderSource = loadShaderFile((char *)"vshader.glsl"); const GLchar* src = vertexShaderSource; // &src就是const GLchar**类型,完美匹配参数 glShaderSource(vertexShader, 1, &src, nullptr);
小提醒
记得在shader编译完成后,释放loadShaderFile分配的内存哦,避免内存泄漏~
内容的提问来源于stack exchange,提问作者Kim94
相关产品推荐
相关产品推荐

