如何在C中初始化仅标题全局变量

时间:2012-02-14 03:41:59

标签: c initialization global-variables

我在一个仅限标题的库中定义了一个函数,如下所示:

inline bar **foo_ptr() {
    static bar *value = NULL;
    return &value;
}

这是我初学化全局变量而不在* .c文件中定义它的hackish方法。

这在VS2010中编译得很好(在#define内联__inline之后),但是在任何尝试在MinGW中编译它时,都会以多重定义愤怒的方式死掉。这让我很伤心。

AFAIK,我不能只使用static inline函数,因为它会创建多次出现的值,对于这种情况,这是非常糟糕的事情。

为了使这项工作,我应该使用哪些关键字?我完全错了吗?是否有另一种方法将仅标题全局变量初始化为NULL?

我宁愿远离init方法。

谢谢:D

2 个答案:

答案 0 :(得分:1)

C99标准见§6.7.4函数说明符:

  

¶2具有外部链接的函数的内联定义不应包含a的定义   具有静态存储持续时间的可修改对象,并且不应包含对引用的引用   带内部联系的标识符。

您的函数当前正在尝试返回指向局部变量的指针;这是一个众所周知的禁忌。但是该标准禁止您将该变量更改为静态变量。如果有一个外部变量value,那么就可以使它变得有效。但它可能会击败你想要实现的目标:

extern bar *value;

inline bar **foo_ptr() {
    value = NULL;
    return &value;
}

但必须声明变量,因此可以访问它。它也必须在某处定义。坦率地说,如果你需要一个全局变量,你最好只接受它,最好使用(声明,定义)一个。

答案 1 :(得分:0)

好吧,我会在这里回答我自己的问题,但是归功于Jason Coco(如果你想做出自己的答案,我很乐意接受这一点)。

无论如何 - 解决方案是简单地声明全局变量而不初始化它。编译器会自动将其设置为null。

bar *foo;

问题解决了:))