不能使用`getpagesize()`调用在C中设置全局变量

时间:2014-09-23 00:09:38

标签: c global paging

使用以下代码

#include <unistd.h>

int a = getpagesize();

int main() {
    return a;
}

我收到以下编译错误

3:1: error: initializer element is not constant

什么是“初始化元素”,为什么它需要保持不变?这与const限定符有关吗?

1 个答案:

答案 0 :(得分:4)

用于初始化全局变量的值需要在编译时确定。在运行时之前,不会评估函数的返回值(至少在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,即文件范围而不是真正的全局。 {C}中的const - 从来都不是 开头的好处 - 当你可以严格控制哪些代码访问该变量时,它会大大减少。