понеділок, 25 липня 2011 р.

Some examples of string operations in C preprocessor


  1. /*
  2.     Some rabbits
  3. */
  4. #define HELLO hello
  5. #define A 0xDEADBEAF
  6. #define B A
  7. #define C B
  8. #define N
  9. #undef U
  10.     
  11. /*
  12.     More rabbits (female this time)
  13. */
  14. #define CONCAT(x,y) x ## y
  15. #define STRINGIFY(x) #x
  16. #define STRINGIFY_DEF(x) STRINGIFY(x) /* Interesting rabbit */
  17.     
  18. /*
  19.     Let's make an EXPERIMENT!!!
  20. */
  21. #define X1 STRINGIFY("str")
  22. #define X2 STRINGIFY(A)
  23. #define X3 STRINGIFY(B)
  24. #define X4 STRINGIFY(C)
  25. #define X5 STRINGIFY(N)
  26. #define X6 STRINGIFY(U)
  27.     
  28. #define X11 STRINGIFY_DEF("str")
  29. #define X12 STRINGIFY_DEF(A)
  30. #define X13 STRINGIFY_DEF(B)
  31. #define X14 STRINGIFY_DEF(C)
  32. #define X15 STRINGIFY_DEF(N)
  33. #define X16 STRINGIFY_DEF(U)
  34.     
  35. #define X101 STRINGIFY(CONCAT(a, b))
  36. #define X102 STRINGIFY(CONCAT(A, N))
  37. #define X103 STRINGIFY(CONCAT(HE, LLO))
  38. #define X104 STRINGIFY_DEF(CONCAT(HE, LLO))
  39.  
  40. #include <stdlib.h>
  41. #include <stdio.h>
  42.  
  43. #define PRINT_STR(expr) printf(#expr " = %s\n", expr);
  44.  
  45. int main() {
  46.     PRINT_STR(X1);
  47.     PRINT_STR(X2);
  48.     PRINT_STR(X3);
  49.     PRINT_STR(X4);
  50.     PRINT_STR(X5);
  51.     PRINT_STR(X6);
  52.  
  53.     PRINT_STR(X11);
  54.     PRINT_STR(X12);
  55.     PRINT_STR(X13);
  56.     PRINT_STR(X14);
  57. #ifdef __GNUC__
  58.     PRINT_STR(X15); /* Won't work in MSVC */
  59. #endif
  60.     PRINT_STR(X16);
  61.  
  62.     PRINT_STR(X101);
  63.     PRINT_STR(X102);
  64.     PRINT_STR(X103);
  65.     PRINT_STR(X104);
  66. }
* This source code was highlighted with Source Code Highlighter.
MS VC++ outputs:
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 ()

2 коментарі:

  1. STRINGIFY_DEF(x) потрібо два проходи аби розгорнутись? Цікаво, чому тоді він так по різному поводиться на різних символах?

    ВідповістиВидалити
  2. Ой, я там помилився (вже поправив)
    В тому якраз то і фішка - STRINGIFY завжди поверне той текст, що є його параметром, так як його видно в текстовому редакторі.
    Поки розбирався, знайшов проблеми - несумісність між VC++ i GCC... (X15) :(

    ВідповістиВидалити