2012-02-01 13 views
9

Czy możliwe jest połączenie łańcucha z innego makra, gdy #include nazwa pliku (w C). Na przykład,Łączenie ciągów w C#include filename

mam,

#define AA 10 
#define BB 20 

są to parametry, które zmieniają się program działa

a plik to:

#include "file_10_20" // this changes correspondingly i.e. file_AA_BB 

Czy to możliwe, aby mieć coś jak #include "file_AA_BB" jakoś ? Wyszukałem go, aby stwierdzić, że operator podwójnego funta może dobierać strun, ale nie może znaleźć sposobu na zrobienie tego.

Każda pomoc zostanie doceniona.

+0

spróbuj '#include # (plik _ ## AA ## _ ## BB)' – asaelr

Odpowiedz

16

Najpierw myślałem, że „proste”, ale to nie potrwać kilka prób, aby dowiedzieć się:

#define AA 10 
#define BB 20 

#define stringify(x) #x 
#define FILE2(a, b) stringify(file_ ## a ## _ ## b) 
#define FILE(a, b) FILE2(a, b) 

#include FILE(AA, BB) 

Zgodnie z wnioskiem postaram się wyjaśnić. FILE(AA, BB) rozwija się do FILE2(AA, BB), ale następnie AA i BB jest rozwijany przed plikiem FILE2, więc następna ekspansja to FILE2(10, 20), która rozwija się do stringify(file_10_20), która staje się ciągiem znaków.

Jeśli pominiesz FILE2, otrzymasz numer stringify(file_AA_BB), który nie zadziała. Standard C faktycznie spędza kilka stron określających, w jaki sposób wykonuje się ekspansję makr. Z mojego doświadczenia wynika, że ​​najlepszym sposobem na myślenie jest "jeśli nie było wystarczającej rozbudowy, dodaj kolejną warstwę z define"

Tylko mocno nie będzie działać, ponieważ # jest stosowane, zanim AA zostanie zastąpione przez 10. W ten sposób zwykle chcesz faktycznie, np:

#define debugint(x) warnx(#x " = %d", x) 
debugint(AA); 

wypisze

AA = 10 
+0

Jeśli jesteś w stanie wytłumaczyć mi, dlaczego makro PLIKU jest potrzebne, zrobię to ;-). Widziałem już wiele takich konstrukcji i nigdy nie rozumiałem, dlaczego tylko 2 makra nie działają, a nawet dlaczego odpowiedź Asael nie działa. Jestem bardzo zainteresowany poznaniem, jak działa preprocesor w twoim przykładzie. Czy ktoś może wyjaśnić? – Artur

+1

Nie zapomnij o #godzeniu PLIKU, ponieważ zderzy się on z czymś w wildplasser

+0

Dobrze, może nie jest najlepszym wyborem nazwy makra. –

5

zazwyczaj jest stosowany tak:

#define stringify(x) #x 
#define expand_and_stringify(x) stringify(x) 

#define AA 10 
#define BB 20 

#define TEXT1 "AA = " stringify(AA) " BB = " stringify(BB) 
#define TEXT2 "AA = " expand_and_stringify(AA) " BB = " expand_and_stringify(BB) 

TEXT1 = "AA = AA BB = BB" 
TEXT2 = "AA = 10 BB = 20" 

Nazywa się uszeregowanie. Powinieneś sprawdzić this answer.

+0

Czy to nie powinno działać dla instrukcji include? Zobacz http://stackoverflow.com/questions/20524491/preprocessor-concatenation-for-include-path/20524959#20524959 i http://stackoverflow.com/questions/39038867/string-concatenation-for-include-path – Antonio

Powiązane problemy