[preproc] #define KEY pass KEY [preproc] #define KEY fail pass [preproc] #define KEY(a, b) a KEY(pass, fail) [preproc] /* Make sure argument expansion replaces the right tokens. */ #define KEY(pass, fail) fail KEY(fail, pass) [preproc] #define KEY (pass) KEY(a,b) [preproc] #define FUNC(a) pass #define LEFT FUNC( LEFT fail) [preproc] #define KEY(a, b) a KEY( pass , fail ) [preproc] /* Function-like macros which cannot be expanded (due to argument count mismatch * or other parse errors) emit only the macro name and nothing else. In the case * of unterminated macro lists, nothing after the macro name is emitted. */ #define pass(a, b) a b fail pass(fail, fail fail [preproc] #define pass(a, b) fail pass(fail, fail, fail) [preproc] #define KEY(a, b) fail KEY(fail, fail, fail) pass [preproc] #define pass(a, b) fail pass (a, b) [preproc] #define FUNC(a) pass #define KEY FUNC KEY (fail) [preproc] #define KEY(a, b) a ## b KEY ( pa , ss ) [preproc] #define KEY(a, b) pa ## ss KEY(fail, fail) [preproc] #define KEY(a) a ## ss KEY(pa) [preproc] #define KEY(a) pa ## a KEY(ss) [preproc] #define KEY(x) p \ ## \ x \ ## \ ss KEY( a ) [preproc] /* Concatenation is only parsed if the macro has arguments. */ #define KEY fa ## il KEY pass [preproc] #define KEY(a) a KEY(pa ## ss) [preproc] fa ## il pass [preproc] #define KEY1 KEY2 #define KEY2 pass KEY1 [preproc] #define KEY2 pass #define KEY1 KEY2 KEY1 [preproc] #define KEY fail #undef KEY KEY pass [preproc] #define KEY(a,b) fail #undef KEY KEY(pass, pass) [preproc] #define KEY1 KEY2 #define KEY2 fail #undef KEY2 KEY1 pass [preproc] #define KEY2 fail #define KEY1 KEY2 #undef KEY2 KEY1 pass [preproc] #define KEY1(a, b) a #define KEY2 pass #define KEY3 fail KEY1(KEY2, KEY3) [preproc] #define a b #define KEY(a) b KEY(fail) pass [preproc] #define a b #define KEY(a) a KEY(pass) [preproc] #define OP== #if 2 OP 3 fail #elif 2 OP 2 pass #endif [preproc] #define KEY 1 #if KEY == 1 pass #endif [preproc] #define KEY(a, b) (a < b) #if KEY(2, 1) fail #elif KEY(1, 2) pass #endif [preproc] #define KEY fail #define KEY pass KEY [preproc] /* Identifiers are not expanded in the LHS of #define statements. */ #define KEY pass #define KEY fail pass [preproc] #undef KEY pass [preproc] #define KEY(a, b) b KEY("fail,fail",pass) [preproc] #define \ KEY( \ a \ , \ b \ ) \ a KEY(pass, fail) [preproc] #define \ KEY \ pass KEY [preproc] #define KEY(a, b) b KEY(multiline argument,pass) [preproc] #define KEY(a, b) b KEY( multiline #define fail pass argument, fail) [preproc] #define KEY(a, b) a KEY((pass,pass),(fail,fail)) [preproc] #define KEY(a, b) b KEY((,,fail,,fail,,),(,,pass,,pass,,)) [preproc] #define KEY(a, b) b KEY([,,fail,,fail,,],[,,pass,,pass,,]) [preproc] #define KEY(a, b) b KEY({,,fail,,fail,,},{,,pass,,pass,,}) [preproc] #define KEY(a, b) pass KEY((),()) [preproc] #define KEY(a, b) pass KEY((,),(,)) [preproc] /* Unbalanced parentheses result in an unterminated macro. */ #define pass(a, b) fail pass((),() [preproc] #define KEY(a,a) a KEY(pass,fail) [preproc] /* Macro arguments suffer their own macro expansion only after the macro has * been completely parsed. */ #define KEY(a) a KEY(fail #define fail pass ) [preproc] /* The same applies to #if. */ #define KEY(a) a KEY( #define OBJ #ifdef OBJ pass #endif ) [preproc] #define KEY(a) a KEY(pass #ifdef OBJ fail #endif #define OBJ ) [preproc] /* Directives inside of macro arguments are always evaluated. */ #define FUNC(a) value FUNC(fail #define KEY pass ) KEY [preproc] #define FUNC1(a) a ## ss #define FUNC2(a, b) a < b FUNC1( #if FUNC2(3, 2) fail #elif FUNC2(2, 3) pa #else fail #endif ) [preproc] #define __LINE__ pass __LINE__ [preproc] #define KEY pass apple # KEY [preproc] #define KEY2(x) x ## ss #define KEY(a) KEY2(a) KEY(pa) [preproc] #define KEY2(x) x #define KEY KEY2(fa il) KEY pass [preproc] #define Key1::Key2 pass Key1::Key2 [preproc] #define ::Key pass ::Key [preproc] #define Key1::Key2(x) pass Key1::Key2(fail) [preproc] #define Key1::Key2::Key3 pass Key1::Key2::Key3 [preproc] #define Key1:pass value Key1:pass [preproc] #define Key1::::pass value Key1::::pass [preproc] #define fail:: pass fail [preproc] #define pass bar #define key::bar fail key::pass [preproc] #define pass bar #define bar::key fail pass::key [preproc] #define fail::1KEY pass fail::1KEY [preproc] #define::pass value ::pass [preproc] #define fail(key1::key2) key1::key2 fail(pass) [preproc] #define key1:: key2 pass key1 [preproc] #define key1 ::key2 pass key1 [preproc] #define KEY(a, b) a b KEY(KEY(x, y), pass)