c/c++语言开发共享错误初始化元素不是常量

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

报告错误的代码段:

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; 

    如果编译器认为stderrstdout不是常量表达式,则不是合法代码。

    这是标准对stderrstdout看法。

    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; ... 

      以上就是c/c++开发分享错误初始化元素不是常量相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560789.html

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐