使用 const 修饰符进行类型转换 gcc 错误[重复]

问题描述 投票:0回答:1

我正在使用 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++编译就没有这个错误?

c gcc opengl g++
1个回答
0
投票

这与指针变量指向的字符数组

const
无关。这是因为你试图从全局范围调用一个函数,在任何函数之外,你绝对不能在 C 中这样做。如果你这样做,它可能会工作得更好:

const char *vertexShaderSource;
...
int main(void)
{
    vertexShaderSource = string_from_file("src/shaders/main_vert.glsl");
...
}
© www.soinside.com 2019 - 2024. All rights reserved.