我在一个只有头的库中定义了一个函数,如下所示:
inline bar **foo_ptr() {
static bar *value = NULL;
return &value;
}
这是我初始化全局变量的方法,而不在*.c文件中定义它。
这在VS2010中编译得很好(在#define inline__inline之后),但在任何试图在MinGW中编译它的尝试中,它都会在多定义愤怒的情况下消亡。这让我很难过。
AFAIK,我不能只使用static inline
函数,因为它会创建多个值,在这种情况下,这是一件非常糟糕的事情。
我真正应该使用什么关键字才能使其工作?我是不是完全错了?有没有其他方法可以将只包含标头的全局变量初始化为NULL?
我更愿意远离init方法。
感谢:D
C99标准在§6.7.4节中规定了功能说明符:
¶2具有外部链接的函数的内联定义不应包含具有静态存储持续时间的可修改对象,并且不应包含对具有内部链接的标识符。
您的函数当前正试图返回一个指向局部变量的指针;这是众所周知的禁忌。但该标准禁止您将该变量更改为静态变量。如果有一个外部变量value
,那么它就可以工作了。但它可能会挫败你试图实现的目标:
extern bar *value;
inline bar **foo_ptr() {
value = NULL;
return &value;
}
但是必须声明变量,这样它才是可访问的。它也必须在某个地方定义。坦率地说,如果你需要一个全局变量,最好使用(声明、定义)一个,你会更好地接受这一点。
好吧,我要在这里回答我自己的问题,但这一切都归功于Jason Coco(如果你想自己回答,我很乐意接受)。
无论如何,解决方案是简单地声明全局变量而不初始化它。编译器会自动将其设置为null。
bar *foo;
问题已解决:)