2016-07-01 3 views
0

От finding-c++-static-initialization-order-problems, Я хочу определить макрос в файле заголовка, например. «check_fiasco.h», затем поместите этот файл заголовка в начало каждого файла cpp, как идея Уоррена Стивенса. Тем не менее, я пробовал его код под Linux, и он не работает (он компилируется, но сбой при его выполнении).определить макрос с именем файла

Я попробовал следующий макрос:

#define TOKENCONCAT(x, y) x ## y 
#define file_init_(x, y) TOKENCONCAT(x, y) 
#define FIASCO_FINDER_DEC \ 
    void file_init_(file_, __FILE__)(void) ((constructor)) ; 

#define FIASCO_FINDER_IMPL \ 
    void file_init_(file_, __FILE__)(void) __attribute__ {\ 
     printf("Good Morning, %s!\n", __FILE__);\ 
     return ;\ 
    } 

Однако, это не работает, как имя файла вклейки с «/» не допускается для имени функции. Я не могу использовать __COUNTER__, так как декларация и реализация должны быть одинаковыми.

Любые идеи?

+0

Это проблема на C++ и не имеет ничего общего с C. Я удалю тег C. – Lundin

ответ

0

Вам не нужно, чтобы фактический символ был глобальным символом, поэтому необходимо сделать его уникальным. static символ должен работать нормально:

static void file_init_() ((constructor)) ; 

static void file_init_() 
{ 
    printf("Good Morning, %s!\n", __FILE__); 
} 

Или, если вы настаиваете, то вы можете поставить глобальную функцию в анонимное пространство имен, которое компилятор обеспечит будет уникальным для каждого ЕП.

+0

Можете ли вы подробнее рассказать? Я имею в виду, как выглядит заголовок и как файл cpp использует заголовок? например, я пробовал идею Уоррена Стивенса, она компилируется, но не работает с моей платформой (рукой). до сих пор, что работает, я положил объявление функций и реализацию непосредственно в файл cpp. но поскольку у меня есть сотни тысяч файлов, поэтому я пытаюсь с файлом заголовка, но не сделал его работу :-( – pepero

+0

Я понятия не имею, что вам нужно для разработки. Это то, что было бы скомпилировано, поэтому макрос просто определите это. –