错误初始化元素不是常量
我的代码有问题,我无法解决….
报告错误的代码段:
static FILE *debugOut = stderr; static FILE *infoOut = stdout;
gcc返回的错误是:
initializer element is not constant
ANSI C标准不要求stderr
/ stdout
必须是常量表达式。
因此,取决于使用的标准C库代码
static FILE *debugOut = stderr;
编译或产生您询问的错误消息。
例如, GNU C库将 stderr
/ stdout
/ stdin
定义为非常量表达式。
您基本上有两种选择来处理这种情况,即使这些代码可移植。
从main初始化
static FILE *debugOut = NULL; static FILE *infoOut = NULL; int main(int argc, char **argv) { debugOut = stderr; infoOut = stdout; // [..] return 0; }
从构造函数初始化
在许多平台上,您可以将函数声明为构造函数,这意味着它在调用main()
之前在启动时调用。 例如,当使用GCC时,您可以像这样实现它:
static FILE *debugOut = NULL; static FILE *infoOut = NULL; static void init_streams(void) __attribute__((constructor)); static void init_streams(void) { debugOut = stderr; infoOut = stdout; }
这种构造函数属性语法不是标准化的,但由于GCC非常普遍,而其他编译器也在努力实现GCC兼容性,因此实际上它非常便于携带。
如果您需要将其移植到没有类似声明function的其他编译器,您可以使用__GNU_LIBRARY__
和/或__GNUC__
等宏来保护此代码。
尝试在主要做例如:
static FILE *debugOut; static FILE *infoOut; main(){ debugOut = stderr; infoOut = stdout; }
从C99标准:
6.7.8初始化
约束
4具有静态存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字。
因此,
static FILE *debugOut = stderr; static FILE *infoOut = stdout;
如果编译器认为stderr
和stdout
不是常量表达式,则不是合法代码。
这是标准对stderr
和stdout
看法。
7.19输入/输出
7.19.1简介
…
stderr stdin stdout
它是“指向
FILE
的指针”类型的表达式,它们分别指向与标准错误,输入和输出流相关联的FILE
对象。
解
处理此问题的标准兼容方法是将变量初始化为NULL
并在main
设置它们的值。
static FILE *debugOut = NULL; static FILE *infoOut = NULL; int main() { debugOut = stderr; infoOut = stdout; ...