C 文件*。=标准输出:错误初始值设定项元素不是常量
我的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
[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;
}