我的代码有问题,我无法解决....
报告错误的代码段:
static FILE *debugOut = stderr;
static FILE *infoOut = stdout;
Run Code Online (Sandbox Code Playgroud)
gcc返回的错误是:
initializer element is not constant
Run Code Online (Sandbox Code Playgroud)
尝试在主要做例如:
static FILE *debugOut;
static FILE *infoOut;
main(){
debugOut = stderr;
infoOut = stdout;
}
Run Code Online (Sandbox Code Playgroud)
ANSI C标准不要求stderr/ stdout必须是常量表达式.
因此,取决于使用的标准C库代码
static FILE *debugOut = stderr;
Run Code Online (Sandbox Code Playgroud)
编译或产生您询问的错误消息.
例如,GNU C库将 stderr/stdout/ 定义stdin为非常量表达式.
您基本上有两种选择来处理这种情况,即使这些代码可移植.
static FILE *debugOut = NULL;
static FILE *infoOut = NULL;
int main(int argc, char **argv)
{
debugOut = stderr;
infoOut = stdout;
// [..]
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在许多平台上,您可以将函数声明为构造函数,这意味着它在调用之前在启动时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;
}
Run Code Online (Sandbox Code Playgroud)
这种构造函数属性语法不是标准化的,但由于GCC非常普遍,而其他编译器都在努力实现GCC兼容性,因此实际上它非常便于携带.
如果您需要将其移植到没有类似声明功能的其他编译器,您可以使用__GNU_LIBRARY__和/或宏来保护此代码__GNUC__.