5

如果的语法extern

extern <type> <name>;

extern如果我有一个未命名的一次性使用结构,我该怎么办:

struct {
    char **plymouthThemes;
    char *plymouthTheme;
} global;

我试过了

extern global;

没有任何类型,它不起作用。

或者,我必须命名结构吗?

4

3 回答 3

5

您需要命名您的结构并将其放入 .h 文件中,或者在每个使用全局的源文件中手动包含定义。像这样

///glob.h
    struct GlobalStruct
    {
       ///char** ...
       ///
    };

///glob.cpp
   #include "glob.h"
   struct GlobalStruct global; 

///someOtherFile.cpp
#include "glob.h"

extern struct GlobalStruct global; 
于 2010-11-08T11:23:30.813 回答
2

如果您不想命名结构,则有常用方法:

--- 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(替换为空字符串)。但不要这样做:重新定义标准关键字是不好的

于 2010-11-08T11:53:49.987 回答
1

这个想法是你只需要声明一个,但仍然需要在使用它的每个其他文件中定义变量。该定义包括类型(在您的情况下是标题定义结构 - 因此需要包含)和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;
}
于 2010-11-08T12:02:04.347 回答