没有类型的外部

时间:2010-11-08 11:21:46

标签: c extern

如果extern的语法是

extern <type> <name>;

如果我有一个未命名的一次性结构,我该如何extern

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

我试过

extern global;

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

extern struct GlobalStruct global; 

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

答案 2 :(得分:1)

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