【发布时间】:2023-09-12 20:55:01
【问题描述】:
在 C 中定义公开变量的公认标准方法是什么?假设设置如下:
在.h中
typedef struct my_struct{
...
} my_struct;
extern my_struct var1;
在.c中
my_struct var1;
这是正确的用法还是编译器在这里做了不必要的工作?外部人员实际上在这里做什么?我的理解一直是,默认情况下,一切都已经有一个隐含的外部。
【问题讨论】:
在 C 中定义公开变量的公认标准方法是什么?假设设置如下:
在.h中
typedef struct my_struct{
...
} my_struct;
extern my_struct var1;
在.c中
my_struct var1;
这是正确的用法还是编译器在这里做了不必要的工作?外部人员实际上在这里做什么?我的理解一直是,默认情况下,一切都已经有一个隐含的外部。
【问题讨论】:
在变量和函数方面,隐含的extern 部分存在细微差别。
如果你放
void foo(void);
在一个 .h 文件中并将 .h 文件包含在多个 .cc 文件中,因为函数没有在 .h 文件中定义,所以没有任何危害。它只是声明的。
如果你说,
int x;
在同一个 .h 文件中,然后在包含 .h 文件的每个 .c 文件中定义 x。如果 .h 文件具有以下功能,您将收到类似的函数错误:
void foo(void){}
因为这是一个声明,也是一个定义。
要使x 等变量仅作为声明,您需要添加extern 关键字。
【讨论】:
我的理解一直是,默认情况下,一切都已经有一个隐含的外部。
这是真的,但是......
在标头中明确externing var1的目的是:
var1 不是私人的。include 标头正在使用在别处声明的变量。推荐
创建 getter/setter 函数并将 var1 设为私有 (static)。
【讨论】:
include (extern) 的其他文件知道它的地址并且可以直接访问它(读/写)。不管include它有多少个源文件,只有一个变量,而不是每个包含一个。
完全正确。您需要在标头中包含extern,以便告诉编译器var1 存在以及在编译使用它的代码时它的类型是什么。
(我假设您在多个.c 文件中使用var1,其中一个正在定义它。如果您只在一个.c 文件中使用它,则无需如果您在使用之前定义了变量,则在标头中的声明。)
【讨论】:
extern 表示“这是外部的,此处未定义,此处不占用任何空间。” (@RSahu 的回答很好地解释了这一点。)