在头文件中声明一个全局变量`extern const int`但在源文件中只声明`int`

时间:2014-12-31 17:40:22

标签: c header global-variables constants external

我正在试验GCC并发现你可以在头文件中声明外部变量const,但在实现文件中保持它们是可变的。

编辑:这确实不起作用。我编译测试代码的唯一原因是因为我没有包含" header.h" in" header.c"。

header.h:

#ifndef HEADER_H_
#define HEADER_H_

extern const int global_variable;

#endif

header.c:

int global_variable = 17;

这似乎是一个非常好的功能,用于将global_variable只读保存给header.h的用户,但保持可以通过实现进行修改(header.c)。

注意:以下代码只是一个示例,说明这种声明方式将如何阻止分配到global_variable

#include "header.h"

int main(void)
{
    global_variable = 34; /* This is an error as `global_variable` is declared const */
    return 0;
}

因为我之前从未见过技术。我开始怀疑它是否有效。

这是一个定义明确的行为还是GCC没有警告我的错误?

3 个答案:

答案 0 :(得分:6)

const intint不兼容。

例如:

extern const int a;

int a = 2;

在C中无效,因为C表示:

  

(C11,6.7p4)“引用相同对象或函数的同一范围内的所有声明都应指定兼容类型”

在你的情况下,他们不在同一范围内(不同的翻译单位),但C也说:

  

(C11,6.2.7p2)“引用同一对象或函数的所有声明都应具有兼容类型;否则,行为未定义。”

当您违反上述规则时,您正在调用未定义的行为。

请注意,C90具有相同的段落。

答案 1 :(得分:2)

有点晚了,但无论如何。

我认为如果你做这样的事情可能会有用

在header.h中

#ifndef HEADER_H_
#define HEADER_H_

#ifndef HAS_GLOB_VAR
extern const int global_variable;
#endif

#endif

如果您需要在实际定义变量(header.c)的文件中包含标题,您可以执行类似

的操作
#define HAS_GLOB_VAR
#include "header.h"

int global_variable = 17;

...

在其他文件中,您只需包含标题,不要定义HAS_GLOB_VAR

答案 2 :(得分:0)

您没有为global_variable指定值,而是定义它。

相关问题