Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以通过调用C语言中的函数来初始化静态全局变量吗?_C_Static - Fatal编程技术网

我可以通过调用C语言中的函数来初始化静态全局变量吗?

我可以通过调用C语言中的函数来初始化静态全局变量吗?,c,static,C,Static,我可以通过调用C语言中的函数来初始化静态全局变量吗?例如: static int var_01 = fun(); 当我在VC6中使用它时,它成功了。但它在GCC 4.6.1中失败了。 这很奇怪。我猜这种用法在C89中是非法的?还是其他原因导致了这一点?在C99中,据我所知,在C89中,以及具有静态存储持续时间的对象的初始值设定项必须是一个常量表达式或字符串文字,参见C99标准草案部分6.7.8初始化: 具有静态属性的对象的初始值设定项中的所有表达式 存储持续时间应为常量表达式或字符串文字 并且

我可以通过调用C语言中的函数来初始化静态全局变量吗?例如:

static int var_01 = fun();
当我在VC6中使用它时,它成功了。但它在GCC 4.6.1中失败了。
这很奇怪。我猜这种用法在C89中是非法的?还是其他原因导致了这一点?

在C99中,据我所知,在C89中,以及具有静态存储持续时间的对象的初始值设定项必须是一个常量表达式或字符串文字,参见C99标准草案部分
6.7.8
初始化:

具有静态属性的对象的初始值设定项中的所有表达式 存储持续时间应为常量表达式或字符串文字

并且函数调用不是第6.6节中的常量表达式,该节中的常量表达式表示(强调我的):

常量表达式不得包含赋值、增量、, 减量、函数调用或逗号运算符,除非它们是 包含在未计算的子表达式中。98)

gcc
使用
-std=c99
-std=c89
生成相同的错误,注意我还使用了以下标志
-Wall-Wextra-pedantic


在VisualStudio编译器的现代版本中,这在C~()中不起作用,但在C++中,这是有效的。因此,您可能在C99中在VisualStudio.c/P>< P>中编译为C++,并且正如我在C89中所知道的那样,对于静态存储持续时间的对象的初始化器必须是常量表达式或字符串文字,从C99标准章节草案<代码> 7.7.8初始化:

具有静态属性的对象的初始值设定项中的所有表达式 存储持续时间应为常量表达式或字符串文字

并且函数调用不是第6.6节中的常量表达式,该节中的常量表达式表示(强调我的):

常量表达式不得包含赋值、增量、, 减量、函数调用或逗号运算符,除非它们是 包含在未计算的子表达式中。98)

gcc
使用
-std=c99
-std=c89
生成相同的错误,注意我还使用了以下标志
-Wall-Wextra-pedantic


在VisualStudio编译器的现代版本中,这在C~()中不起作用,但在C++中,这是有效的。因此,您可能正在编译VisualStudio.c/p>中的C++,因为您的帖子被用C标记。在c语言中,这是一个编译错误。您必须将其初始化为constat文本


请参阅:

,因为您的帖子带有c标签。在c语言中,这是一个编译错误。您必须将其初始化为constat文本


参见:

你需要将它初始化为编译时常数,因此一般不。(也许是,如果你的函数实际上是宏)。SAPI(Fund)是一个普通函数。很奇怪,它可以用VC6编译OK。@ EZIO:你确定你是编译成C,而不是C++?它在C++中是有效的,但在C中@不是。我在C文件中编辑这个,所以我认为应该在C.,但是正如你所说的,我猜VC可以用C++的特性来编译它。你需要把它初始化成编译时常量,所以一般不。(如果你的函数实际上是宏,也许是的)是一个普通函数。很奇怪,它可以用VC6编译OK。@ EZIO:你确定你是编译成C,而不是C++?它在C++中是有效的,但在C.@安德烈我没有在C文件中编辑,所以我认为应该在C.,但是正如你所说的,我猜VC可以用C++的特性编译它。