用下面的代码
#include <unistd.h>
int a = getpagesize();
int main() {
return a;
}
我收到以下编译错误
3:1: error: initializer element is not constant
什么是“初始化元素”,为什么它需要保持不变?这与 const
限定符有关吗?
最佳答案
用于初始化全局变量的值需要在编译时确定。函数的返回值(至少在 C 中)直到运行时才会被评估。所以像这样:
int a = 4;
没问题,但是:
int a = somefunction();
不是。在 C++ 中,您可以拥有 constexpr
函数,但在 C 中您不能。
如果你必须做这样的事情,你总是可以使用:
int a;
int main(void) {
a = getpagesize();
/* Rest of your program */
}
显然你不能让你的全局 const
这样做(因为你只能在初始化时设置 const
变量的值,而你不能初始化全局变量有功能)。坦率地说,您可能没有理由不能在需要时调用 getpagesize()
而完全忘记全局变量 - 除非您调用它十亿次,否则您不会注意到开销.如果您必须有一个全局变量,那么就不要将其设为 const
。
如果不变性是绝对要求,并且问题是避免昂贵的函数调用而不是完全避免函数调用,那么一个选择是用廉价的函数调用替换它,如下所示:
int poor_mans_global(void) {
static int a = -1;
if ( a == -1 ) {
a = getpagesize(); /* Only call the expensive function once */
}
return a;
}
并调用 poor_mans_global()
而不是使用您的全局变量。请注意,此示例只是说明性的,并不意味着 getpagesize()
是一个昂贵的函数调用。
最后一个选择是将所有需要访问这个全局的代码打包到一个单独的翻译单元中,并使全局 static
,即文件范围而不是真正的全局。 const
的好处 - 在 C 语言中从来都不是的好处 - 当您可以严格控制哪些代码可以访问该变量时,这些好处会急剧减少。
关于无法使用 `getpagesize()` 调用在 C 中设置全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25984935/