c - 如何在 C 中初始化仅 header 的全局变量

标签 c initialization global-variables

我在一个仅包含头文件的库中定义了一个函数,如下所示:

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

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

这在 VS2010 中编译得很好(在 #define inline __inline 之后),但是在 MinGW 中尝试编译它时,它会在多重定义愤怒的愤怒中死去。这让我很伤心。

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

我应该真正使用什么关键字才能完成这项工作?我是不是完全错了?是否有其他方法可以将仅 header 全局变量初始化为 NULL?

我宁愿远离初始化方法。

谢谢:D

最佳答案

C99 标准在§6.7.4 函数说明符部分说:

¶2 An inline definition of a function with external linkage shall not contain a definition of a modifiable object with static storage duration, and shall not contain a reference to an identifier with internal linkage.

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

extern bar *value;

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

但是变量必须被声明,所以它是可访问的。它也必须在某处定义。坦率地说,如果您需要一个全局变量,最好接受(声明、定义)一个全局变量。

关于c - 如何在 C 中初始化仅 header 的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9271396/

相关文章:

c - 使用恒定大小的二维数组时获取 "execvp error: Bad address"

char *filenames[1] 或 char *filenames 有什么区别?

java - 未初始化的对象与新对象

functional-programming - 全局命名空间中的 JavaScript 库函数 - 缺点?

php - 如何静态分析 php 脚本以检测全局变量的使用

c - 如何在主函数中初始化结构

c - 我的 C 程序无法在 NetBeans 上运行,但在 Android 移动 C 编译器应用程序上运行良好

iPhone 开发者 : UIImageview subclass interface builder - how to call custom initializer

c++ - (c++) 检查指针数组的空值

python - Tkinter 按钮命令不运行