C &引用;错误:初始值设定项元素不是常量;在16年前的代码中

C &引用;错误:初始值设定项元素不是常量;在16年前的代码中,c,linux,gcc,compilation,C,Linux,Gcc,Compilation,我正在尝试编译一个16年前的LinuxC程序。无论如何我已经在编辑Makefile和将编译器更改为旧版本方面取得了长足的进步。我现在面临一个我认为只会在旧编译器中编译的bug,尽管我不能选择旧的,因为这会破坏系统解决方案。我不太精通C。 我正在使用GentooLinux和GCC版本3.4.6来编译这篇文章 ./src/radcheck.c:97: error: initializer element is not constant make: *** [src/radcheck.o] Error

我正在尝试编译一个16年前的LinuxC程序。无论如何我已经在编辑Makefile和将编译器更改为旧版本方面取得了长足的进步。我现在面临一个我认为只会在旧编译器中编译的bug,尽管我不能选择旧的,因为这会破坏系统解决方案。我不太精通C。 我正在使用GentooLinux和GCC版本3.4.6来编译这篇文章

./src/radcheck.c:97: error: initializer element is not constant
make: *** [src/radcheck.o] Error 1
有问题的代码,File*msgfd=stderr;这是第97行

FILE           *ddt = NULL;
FILE           *msgfd = stderr;
extern void     dir_init ();
从在线阅读有关此错误的信息可以看出此代码需要重写吗

如果有人能帮我解决这个问题,我会非常高兴

FILE *msgfd = stderr;
全局范围内的对象不能由非常量初始化。所有标准C版本都是这样。在以前的实现中:要么编译器允许它作为扩展,要么
stderr
是地址常量。要修复此错误,请将初始化(使用赋值)放在init函数中

全局范围内的对象不能由非常量初始化。所有标准C版本都是这样。在以前的实现中:要么编译器允许它作为扩展,要么
stderr
是地址常量。要修复此错误,请将初始化(使用赋值)放在init函数中

全局范围内的对象不能由非常量初始化。所有标准C版本都是这样。在以前的实现中:要么编译器允许它作为扩展,要么
stderr
是地址常量。要修复此错误,请将初始化(使用赋值)放在init函数中


全局范围内的对象不能由非常量初始化。所有标准C版本都是这样。在以前的实现中:要么编译器允许它作为扩展,要么
stderr
是地址常量。要修复此错误,请将初始化(使用赋值)放入init函数。

可能重复:由于此链接,我计算出了id。感谢可能的重复:我发现了这个链接的id。感谢可能的重复:我发现了这个链接的id。感谢可能的重复:我发现了这个链接的id。Thanksnote:通过“一个init函数”,显然这必须在调用任何依赖于
msgfd
的函数之前完成,因此一个好的位置要么是
main
的开始,要么是您添加的一个从
main
开始调用的函数,它初始化静态数据。这对我来说完全是希腊语。你能帮我做一些代码示例吗?我可能会把它改编成这段代码。非常感谢@Plindgren
文件*msgfd;int main(void){msgfd=stderr;/*…*/}
一定有比这个更好的答案。我有一个程序,有成千上万个这样的错误,过去编译时根本没有问题。现在编辑源代码并使其符合C编译器的迟钝要求是不可行的。注意:通过“init函数”,显然这必须在调用任何依赖于
msgfd
的函数之前完成,因此一个好地方可能是
main
的开始,或者是一个从
main
开始调用的函数,它初始化静态数据。我完全不懂这一点。你能帮我做一些代码示例吗?我可能会把它改编成这段代码。非常感谢@Plindgren
文件*msgfd;int main(void){msgfd=stderr;/*…*/}
一定有比这个更好的答案。我有一个程序,有成千上万个这样的错误,过去编译时根本没有问题。现在编辑源代码并使其符合C编译器的迟钝要求是不可行的。注意:通过“init函数”,显然这必须在调用任何依赖于
msgfd
的函数之前完成,因此一个好地方可能是
main
的开始,或者是一个从
main
开始调用的函数,它初始化静态数据。我完全不懂这一点。你能帮我做一些代码示例吗?我可能会把它改编成这段代码。非常感谢@Plindgren
文件*msgfd;int main(void){msgfd=stderr;/*…*/}
一定有比这个更好的答案。我有一个程序,有成千上万个这样的错误,过去编译时根本没有问题。现在编辑源代码并使其符合C编译器的迟钝要求是不可行的。注意:通过“init函数”,显然这必须在调用任何依赖于
msgfd
的函数之前完成,因此一个好地方可能是
main
的开始,或者是一个从
main
开始调用的函数,它初始化静态数据。我完全不懂这一点。你能帮我做一些代码示例吗?我可能会把它改编成这段代码。非常感谢@Plindgren
文件*msgfd;int main(void){msgfd=stderr;/*…*/}
一定有比这个更好的答案。我有一个程序,有成千上万个这样的错误,过去编译时根本没有问题。现在编辑源代码并使其符合C编译器迟钝的要求是不可行的。