如果的语法extern
是
extern <type> <name>;
extern
如果我有一个未命名的一次性使用结构,我该怎么办:
struct {
char **plymouthThemes;
char *plymouthTheme;
} global;
我试过了
extern global;
没有任何类型,它不起作用。
或者,我必须命名结构吗?
您需要命名您的结构并将其放入 .h 文件中,或者在每个使用全局的源文件中手动包含定义。像这样
///glob.h
struct GlobalStruct
{
///char** ...
///
};
///glob.cpp
#include "glob.h"
struct GlobalStruct global;
///someOtherFile.cpp
#include "glob.h"
extern struct GlobalStruct global;
如果您不想命名结构,则有常用方法:
--- global.h: (file with global struct definition):
#ifdef GLOBAL_HERE /* some macro, which defined in one file only*/
#define GLOBAL
#else
#define GLOBAL extern
#endif
GLOBAL struct {
char **plymouthThemes;
char *plymouthTheme;
} global;
---- file1.c (file where you want to have global allocated)
#define GLOBAL_HERE
#include "global.h"
---- file2.c (any oher file referencing to global)
#include "global.h"
宏 GLOBAL 是有条件地定义的,因此它的使用将在除定义 GLOBAL_HERE 的源之外的任何地方添加一个带有“extern”的定义。当您定义 GLOBAL_HERE 时,变量将变为非外部变量,因此它将分配在此源的输出对象中。
还有一个简短的技巧定义(在您分配全局变量的单个 .c 文件中设置):
#define extern
这会导致预处理器删除 extern(替换为空字符串)。但不要这样做:重新定义标准关键字是不好的。
这个想法是你只需要声明一个,但仍然需要在使用它的每个其他文件中定义变量。该定义包括类型(在您的情况下是标题定义结构 - 因此需要包含)和extern
关键字,以让编译器知道声明位于不同的文件中。
这是我的例子
分机
struct mystruct{
int s,r;
};
ext1.c
#include "ext.h"
struct mystruct aaaa;
main(){
return 0;
}
ext2.c
#include "ext.h"
extern struct mystruct aaaa;
void foo(){
aaaa;
}
ext3.c
#include "ext.h"
extern struct mystruct aaaa;
void foo2(){
aaaa;
}