Если вы не хотите называть структуру, есть общий метод:
--- 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 (заменить на пустую строку). Но не делайте этого: переопределение стандартных ключевых слов - это плохо .