2015-10-27 40 views
10

Chciałbym użyć dyrektywy #include z nazwą pliku, która jest przekazywana jako zewnętrznie zdefiniowane makro.Podstawianie makra w dyrektywie #include

E.g.

#include #FILE".h" 

gdzie FILE byłoby zdefiniowane jako ciąg MyFile (bez cudzysłowów), w wyniku

#include "MyFile.h" 

stringizing operatora # nie może być stosowany tu jako symbol FILE makro nie jest argumentem. Próbowałem innych podejść, bezskutecznie.

Czy widzisz rozwiązanie?

+1

gcc zapewnia funkcjonalność * zewnętrznie * obejmuje pliki http://stackoverflow.com/questions/3387453/include-header-files-using-command-line-option. To może ci pomóc. –

+0

Interesujące. Używam zarówno gcc, jak i MSVC, a moja dyrektywa #include może nie znajdować się na pierwszej pozycji. –

+2

Nie będzie to możliwe, ponieważ sąsiednia ciągła literalna konkatenacja nie jest wykonywana przed etapem preprocesora, np. '" MyFile "". H "' nie będzie prawidłową nazwą włącznika. Nie możesz po prostu zdefiniować "PLIK" jako rzeczywistej nazwy nagłówka, która ma zostać dołączona, np. '-DFILE =" MyFile.h "'? –

Odpowiedz

12

Dosłowne połączenie konkatenacji odbywa się po dwóch fazach translacji po #include - dyrektywy są rozwiązywane; twoje podejście nie może działać. Zamiast tego spróbuj coś według linii

#define STRINGIZE_(a) #a 
#define STRINGIZE(a) STRINGIZE_(a) 

#define MYFILE stdio 
#include STRINGIZE(MYFILE.h) 

int main() { 
    printf("asdf"); 
} 

Demo.

+0

Niesamowite, działa idealnie! –