2016-12-14 47 views

Odpowiedz

2

TL; DR Zmienna nazwa T podlega MACRO zamiennik, a nie inicjator 'T'.


Aby opracować, #define makr powodować zamienniki tekstowe i wszystko wewnątrz „cytatów” (albo '' lub "") nie są częścią MAKRO wymiany.

Tak w istocie, spróbuj uruchomić preprocesora na kodzie (przykład: gcc -E test.c) i wygląda na to,

char t = 'T'; 
printf("\n%c\t%c\n",t,t); 

Run gcc -E main.c -o test.txt && tail -f test.txt and See it online

które expectedly, wypisuje wartość zmiennej t , T T.

To powiedziawszy, dla hostowanego środowiska, wymagany podpis dla main() jest co najmniej int main(void).

+1

nie masz na myśli 'T T'? – DBPriGuy

+0

@DBPriGuy Dobrze, moja zła. Edytowane częściowo. –

+1

@SouravGhosh Ale wyjście to T T, a nie t t. –

8

Preprocesor nie zastępuje żadnego tekstu w cudzysłowie, bez względu na to, czy są to pojedyncze cudzysłowy czy podwójne cudzysłowy.

Stała znakowa 'T' pozostaje niezmieniona.

Z sekcji 6.10.3 z C standard:

Dyrektywa przerób formy

# define identifier replacement-list new-line 

określa macro jak powodujący każdy kolejny wystąpienie makro nazwa 171) zostanie zastąpiona przez listę wymiany żetonów przetwarzania wstępnego , które stanowią pozostałą część dyrektywy. Lista zastępcza zostanie następnie ponownie przeskanowana, aby uzyskać więcej nazw makr , jak określono poniżej.

171) Ponieważ od czasu makro zastępczej, wszystkie stałe znakowe i literały łańcuchowe są przerób tokeny, nie sekwencje ewentualnie zawierające podsekwencje identyfikator-like (patrz 5.1.1.2, tłumaczenie fazy), nigdy nie są skanowane pod kątem nazw makr lub parametrów.