Właśnie się dowiedziałem, że gcc wydaje się traktować wynik rozszerzenia makra podobnego do funkcji jako oddzielny token. Oto prosty przykład pokazujący zachowanie gcc:Rozbudowa makra podobnego do funkcji tworzy oddzielny token
#define f() foo
void f()_bar(void);
void f()bar(void);
void f()-bar(void);
Kiedy wykonać gcc -E -P test.c
(działa tylko preprocesor), pojawia się następujący komunikat:
void foo _bar(void);
void foo bar(void);
void foo-bar(void);
Wydaje się, że w pierwszych dwóch definicje, gcc wstawia spację po rozwiniętym makrze, aby upewnić się, że jest to oddzielny token. Czy to naprawdę się dzieje?
Czy jest to wymagane przez dowolny standard (nie mogłem znaleźć dokumentacji na ten temat)?
Chcę ustawić _bar
część tego samego tokena. Czy jest jakiś sposób to zrobić? Mógłbym użyć tokenu operatora konkatenacji ##
, ale będzie on wymagał kilku poziomów makr (ponieważ w prawdziwym kodzie f() jest bardziej złożony). Zastanawiam się, czy istnieje proste (i prawdopodobnie bardziej czytelne) rozwiązanie.
Czy Google jest wyłączony? Czy nawet nie próbowałeś znaleźć C [standardu] (http://port70.net/~nsz/c/c11/n1570.html#6.10.3), który jest ** pozornie ** autorytatywnym źródłem do konsultacji. – Olaf
@Olaf - Nie znalazłem żadnego wyraźnego oświadczenia odpowiadającego na moje pytanie ani w C99, ani na linku, który wskazałeś mi. – martinkunev
Aby być uczciwym zachowanie opisane w standardzie nie jest całkowicie oczywiste. Domyślam się, że słowo kluczowe to, że preprocesor zamienia makro na * tokeny *, co oznacza wstawienie spacji w razie potrzeby. – nemetroid