错误初始化元素不是常量

Ale*_*dre 9 c

我的代码有问题,我无法解决....

报告错误的代码段:

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)

faz*_*azo 8

尝试在主要做例如:

static FILE *debugOut;
static FILE *infoOut;

main(){
    debugOut = stderr;
    infoOut = stdout;


}
Run Code Online (Sandbox Code Playgroud)


max*_*zig 7

ANSI C标准不要求stderr/ stdout必须是常量表达式.

因此,取决于使用的标准C库代码

static FILE *debugOut = stderr;
Run Code Online (Sandbox Code Playgroud)

编译或产生您询问的错误消息.

例如,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;
}
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__.