#version 450 // side test verifies multiple rounds of argument expansion #define bear SecondExpansion #define mmmB bear #define mmmA(a) a int mmmA(mmmB); // mmmB -> bear, and then in mmmA(), bear -> SecondExpansion // pasting skips the first round of expansion #define mmcatmmdog PostPasteExpansion #define mmcat cat #define mmdog dog #define mmp(a,b) a## b int mmp(mmcat, mmdog); // mmcat/mmdog not expanded, mmcatmmdog -> PostPasteExpansion // multi-token pre #define mmtokpastepre(a) a##27 mmtokpastepre(float foo); // should declare "float foo27;" // multi-token post #define mmtokpastepost(a) uni ##a mmtokpastepost(form float foo155); // should declare "uniform float foo155;" // non-first argument #define foo ShouldntExpandToThis #define semi ; #define bothpaste(a,b) a##b float bothpaste(foo, 719); // should declare "float foo719;" #define secpaste(a,b) a bar ## b secpaste(uniform float, foo semi) // should declare "uniform float barfoo;" // no args #define noArg fl##oat noArg argless; // bad location #define bad1 ## float bad1 dc1; #define bad2 float ## bad2 dc2; // multiple ## #define multiPaste(a, b, c) a##or##b flo##at foo##c multiPaste(unif, m, 875); // too long #define simplePaste(a,b) a##b // 1020 + 5 characters float simplePaste(ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345, 12345); // non-identifiers int a = simplePaste(11,12); // operators #define MAKE_OP(L, R) L ## R const int aop = 10; const int bop = 4; int cop = aop MAKE_OP(<, <) bop; bool dop = aop MAKE_OP(!,=) bop; #define MAKE_OP3(L, M, R) L ## M ## R void foo() { int e = 16; e MAKE_OP3(>,>,=) 2; // recovery from bad op bool f = e MAKE_OP(>,!) 5; }