C 文件*。=标准输出:错误初始值设定项元素不是常量

C 文件*。=标准输出:错误初始值设定项元素不是常量,c,linux,suse,C,Linux,Suse,我的C代码如下: [Linux:/si/usr/hrl]vi test.c #include <stdio.h> FILE * hw = stdout; int main(void) { return 0; } 我查找了头文件stdio.h,发现stdout似乎被定义为一个常量。那么为什么会产生错误呢?顺便说一下,我在AIX上编译了相同的代码,这是成功的结果 本标准不要求stdin、stdout和stderr为常数 C99的草案n1256在7.19.1

我的C代码如下:

[Linux:/si/usr/hrl]vi test.c    

#include <stdio.h>

FILE * hw = stdout;

int main(void)
{
        return 0;
}

我查找了头文件
stdio.h
,发现
stdout
似乎被定义为一个常量。那么为什么会产生错误呢?顺便说一下,我在AIX上编译了相同的代码,这是成功的结果

本标准不要求
stdin
stdout
stderr
为常数

C99的草案n1256在7.19.1输入/输出中说明

标题声明…

TMP_MAX
它展开为一个整数常量表达式

斯特德尔 标准 stdout
是类型为“指向文件的指针”的表达式

(强调我的)

需要明确说明的是,一些其他值是常量,而对于
stdin
stdout
stderr

因此,您必须将初始化放在main中:

#include <stdio.h>

FILE * hw;

int main(void)
{
        hw = stdout;
        ...
        return 0;
}

但是要小心:它是一个gcc扩展,意味着你的代码不是正确的C。在您的C标准库实现中,
stdout
是如何定义的?它是什么类型的?我看起来不太小心。可能是
extern struct\u IO\u FILE*stdout;/*标准输出流*/。顺便说一句,我使用
c++
并编译,它编译成功。@hrl这个问题与一点非常相关,有些人可能会说你的问题是重复的:我知道你的编辑是正确的。但我想寻找一种方法来成功编译它,而不必在
main()中初始化它
。因为这是我应该从AIX移植到Suse的一小部分程序。我很难像你说的那样修改真正的代码。
#include <stdio.h>

FILE * hw;

int main(void)
{
        hw = stdout;
        ...
        return 0;
}
#include <stdio.h>

FILE * hw;

void initHw(void) __attribute__((constructor)) {
    hw = stdout;
}

int main(void)
{
        return 0;
}