我正在使用 OpenGL,并决定实现一个将着色器源代码从文件加载到字符串的函数。
OpenGL 期望获得
const char*
。
这是我得到的功能:
const char* string_from_file(const char* filename) {
FILE* f = fopen(filename, "r");
if (f == NULL) {
fprintf(stderr, "Error while trying to open %s file\n", filename);
exit(1);
}
char* buf = (char*) malloc(MAX_SHADER_FILE_SIZE);
char c;
size_t i = 0;
while((c = fgetc(f)) != EOF) {
buf[i] = c;
i++;
}
return buf;
}
我从 gcc 收到错误:
#include <GLFW/glfw3.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SHADER_FILE_SIZE 200
void framebuffer_size_callback(GLFWwindow *window, int width, int height);
void processInput(GLFWwindow *window);
void _print_shader_info_log(GLuint shader_index);
const char* string_from_file(const char *filename);
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
const char *vertexShaderSource = string_from_file("src/shaders/main_vert.glsl");
const char *fragmentShaderSource = string_from_file("src/shaders/main_frag.glsl");
如果使用 g++ 编译,则没有错误,它将构建并运行。
所以错误显示:
initializer element is not compile-time constant
。为什么它必须是编译时常量?难道 const type*
的意思不是: this 所指向的东西不应该被改变吗?为什么用g++编译就没有这个错误?
这与指针变量指向的字符数组
const
无关。这是因为你试图从全局范围调用一个函数,在任何函数之外,你绝对不能在 C 中这样做。如果你这样做,它可能会工作得更好:
const char *vertexShaderSource;
...
int main(void)
{
vertexShaderSource = string_from_file("src/shaders/main_vert.glsl");
...
}