我在一个仅限标题的库中定义了一个函数,如下所示:
inline bar **foo_ptr() {
static bar *value = NULL;
return &value;
}
这是我初学化全局变量而不在* .c文件中定义它的hackish方法。
这在VS2010中编译得很好(在#define内联__inline之后),但是在任何尝试在MinGW中编译它时,都会以多重定义愤怒的方式死掉。这让我很伤心。
AFAIK,我不能只使用static inline
函数,因为它会创建多次出现的值,对于这种情况,这是非常糟糕的事情。
为了使这项工作,我应该使用哪些关键字?我完全错了吗?是否有另一种方法将仅标题全局变量初始化为NULL?
我宁愿远离init方法。
谢谢:D
答案 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;
问题解决了:))