внешний без типа - PullRequest
       1

внешний без типа

5 голосов
/ 08 ноября 2010

Если синтаксис extern равен

extern <type> <name>;

как мне extern, если у меня есть неназванная, одноразовая структура:

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

Я пробовал

extern global;

без какого-либо типа, и это не работает.

Или мне нужно назвать структуру?

Ответы [ 3 ]

5 голосов
/ 08 ноября 2010

Вам нужно назвать свою структуру и поместить ее в файл .h или включить определение вручную в каждый исходный файл, который использует global.Как это

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

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

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

extern struct GlobalStruct global; 
2 голосов
/ 08 ноября 2010

Если вы не хотите называть структуру, есть общий метод:

--- 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 определен условно, поэтому его использование будет начинаться с определения «extern» везде, кроме источника, где определен GLOBAL_HERE Когда вы определяете GLOBAL_HERE, тогда переменная становится non-extern, поэтому она будет размещена в выходном объекте этого источника.

Существует также краткое определение уловки (которое устанавливается в одном файле .c, в котором вы размещаете глобальные переменные):

#define extern

, что заставляет препроцессор удалить extern (заменить на пустую строку). Но не делайте этого: переопределение стандартных ключевых слов - это плохо .

1 голос
/ 08 ноября 2010

Идея состоит в том, что вам нужно объявить только одну, но все равно нужно определить переменную в каждом файле, который ее использует.Определение включает в себя как тип (в вашем случае структуру определения заголовка - которая поэтому должна включать), так и ключевое слово 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;
}
...