MS VC++ outputs:
- /*
- Some rabbits
- */
- #define HELLO hello
- #define A 0xDEADBEAF
- #define B A
- #define C B
- #define N
- #undef U
- /*
- More rabbits (female this time)
- */
- #define CONCAT(x,y) x ## y
- #define STRINGIFY(x) #x
- #define STRINGIFY_DEF(x) STRINGIFY(x) /* Interesting rabbit */
- /*
- Let's make an EXPERIMENT!!!
- */
- #define X1 STRINGIFY("str")
- #define X2 STRINGIFY(A)
- #define X3 STRINGIFY(B)
- #define X4 STRINGIFY(C)
- #define X5 STRINGIFY(N)
- #define X6 STRINGIFY(U)
- #define X11 STRINGIFY_DEF("str")
- #define X12 STRINGIFY_DEF(A)
- #define X13 STRINGIFY_DEF(B)
- #define X14 STRINGIFY_DEF(C)
- #define X15 STRINGIFY_DEF(N)
- #define X16 STRINGIFY_DEF(U)
- #define X101 STRINGIFY(CONCAT(a, b))
- #define X102 STRINGIFY(CONCAT(A, N))
- #define X103 STRINGIFY(CONCAT(HE, LLO))
- #define X104 STRINGIFY_DEF(CONCAT(HE, LLO))
- #include <stdlib.h>
- #include <stdio.h>
- #define PRINT_STR(expr) printf(#expr " = %s\n", expr);
- int main() {
- PRINT_STR(X1);
- PRINT_STR(X2);
- PRINT_STR(X3);
- PRINT_STR(X4);
- PRINT_STR(X5);
- PRINT_STR(X6);
- PRINT_STR(X11);
- PRINT_STR(X12);
- PRINT_STR(X13);
- PRINT_STR(X14);
- #ifdef __GNUC__
- PRINT_STR(X15); /* Won't work in MSVC */
- #endif
- PRINT_STR(X16);
- PRINT_STR(X101);
- PRINT_STR(X102);
- PRINT_STR(X103);
- PRINT_STR(X104);
- }
* This source code was highlighted with Source Code Highlighter.
X1 = "str"
X2 = A
X3 = B
X4 = C
X5 = N
X6 = U
X11 = "str"
X12 = 0xDEADBEAF
X13 = 0xDEADBEAF
X14 = 0xDEADBEAF
X16 = U
X101 = CONCAT(a, b)
X102 = CONCAT(A, N)
X103 = CONCAT(HE, LLO)
X104 = hello
GCC outputs:
X1 = "str"
X2 = A
X3 = B
X4 = C
X5 = N
X6 = U
X11 = "str"
X12 = 0xDEADBEAF
X13 = 0xDEADBEAF
X14 = 0xDEADBEAF
X15 =
X16 = U
X101 = CONCAT(a, b)
X102 = CONCAT(A, N)
X103 = CONCAT(HE, LLO)
X104 = hello
STRINGIFY_DEF(N) causes problems:
GCC treats it as empty string ("") and MSVC treats it as just empty define ()
STRINGIFY_DEF(x) потрібо два проходи аби розгорнутись? Цікаво, чому тоді він так по різному поводиться на різних символах?
ВідповістиВидалитиОй, я там помилився (вже поправив)
ВідповістиВидалитиВ тому якраз то і фішка - STRINGIFY завжди поверне той текст, що є його параметром, так як його видно в текстовому редакторі.
Поки розбирався, знайшов проблеми - несумісність між VC++ i GCC... (X15) :(