【发布时间】:2010-11-08 11:21:45
【问题描述】:
如果extern的语法是
extern <type> <name>;
如果我有一个未命名的一次性结构,我该如何extern:
struct {
char **plymouthThemes;
char *plymouthTheme;
} global;
我试过了
extern global;
没有任何类型,它不起作用。
或者,我必须命名结构吗?
【问题讨论】:
如果extern的语法是
extern <type> <name>;
如果我有一个未命名的一次性结构,我该如何extern:
struct {
char **plymouthThemes;
char *plymouthTheme;
} global;
我试过了
extern global;
没有任何类型,它不起作用。
或者,我必须命名结构吗?
【问题讨论】:
您需要命名您的结构并将其放入 .h 文件中,或者在每个使用 global 的源文件中手动包含定义。像这样
///glob.h
struct GlobalStruct
{
///char** ...
///
};
///glob.cpp
#include "glob.h"
struct GlobalStruct global;
///someOtherFile.cpp
#include "glob.h"
extern struct GlobalStruct global;
【讨论】:
global 的文件中执行此操作?
extern struct globalStruct global; 时,其他文件不知道 struct globalStruct 是什么。
如果你不想命名一个结构,有一个通用的方法:
--- 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 关键字,以让编译器知道声明位于不同的文件中。
这是我的例子
ext.h
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;
}
【讨论】: