C预处理器

作者:追风剑情 发布于:2020-3-17 10:16 分类:C

预处理指令:#define、#include、#ifdef、#else、#endif、#ifndef、#if、#elif、#line、#error、#pragma

预处理器不做计算,不对表达式求值。它只进行文本替换。

宏定义还可以包含其他宏(一些编译器可能不支持这种嵌套功能)。

示例

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h> //C99特性
  5. #include <string.h>
  6. #include <math.h>
  7. #include <ctype.h>
  8.  
  9. // 可用反斜杠切换到下一行书写
  10. #define ROW "this is tow row, \
  11. i love you!"
  12.  
  13. // 定义函数宏
  14. // SQUARE是宏标识符,X是宏参数,X*X是替换列表,程序中出现SQUARE(X)的地方都会被X*X替换。
  15. #define SQUARE(X) X*X
  16. // 注意: 避免在宏中出现递增或递减运算符++、--
  17. // 例如,++x*++x,在C标准中并未规定这种情况的计算顺序,不同的编译器可能产生不同的计算结果。
  18. #define PR(X) printf("The result is %d.\n", X)
  19. // #x会被替换成宏参数
  20. #define PSQR(x) printf("The square of " #x " is %d.\n", ((x)*(x)))
  21. // 预处理器黏合剂:##运算符,把两个记号组合成一个记号
  22. #define XNAME(n) x ## n
  23. #define PRINT_XN(n) printf("x" #n " = %d\n", x ## n)
  24.  
  25. int main(int argc, char* argv[])
  26. {
  27. int x = 5;
  28. int z;
  29. int XNAME(1) = 14; // 变成 int x1 = 14;
  30. int XNAME(2) = 20; // 变成 int x2 = 20;
  31. int x3 = 30;
  32. PRINT_XN(1); // 变成 printf("x1 = %d\n", x1);
  33. PRINT_XN(2); // 变成 printf("x2 = %d\n", x2);
  34. PRINT_XN(3); // 变成 printf("x3 = %d\n", x3);
  35.  
  36. printf("x = %d\n", x);
  37. z = SQUARE(x);
  38. printf("Evaluating SQUARE(x):");
  39. PR(z);
  40. z = SQUARE(2);
  41. printf("Evaluating SQUARE(2):");
  42. PR(z);
  43. printf("Evaluating SQUARE(x+2):");
  44. //宏调用在编译之前把参数记号传递给程序
  45. PR(SQUARE(x + 2));//因为预处理器不做计算,这里等价于PR(x+2*x+2)
  46. printf("Evaluating 100/SQUARE(2):");
  47. PR(100 / SQUARE(2));
  48. printf("x is %d.\n", x);
  49. printf("Evaluating SQUARE(++x): ");
  50. PR(SQUARE(++x));
  51. printf("After incrementing, x is %x.\n", x);
  52. PSQR(2+4);
  53.  
  54. system("pause");
  55. return 0;
  56. }


运行测试

1111.png

示例:预处理宏


  1. //#pragma 设置编译器参数
  2. //#pragma c9x on
  3.  
  4. #define _CRT_SECURE_NO_WARNINGS
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <stdbool.h> //C99特性
  8. #include <string.h>
  9. #include <math.h>
  10. #include <ctype.h>
  11.  
  12. //条件编译
  13. #ifdef MAVIS
  14. //旧编译器代码块必须左对齐
  15. #define STABLES 5
  16. #else
  17. //旧编译器代码块必须左对齐
  18. #define STABLES 15
  19. #endif
  20.  
  21. //#ifndef通常用来防止重复定义宏或重复包含头文件
  22. //如果宏未定义
  23. #ifndef SIZE
  24. //新编译器支持代码块缩进
  25. #define SIZE 100
  26. #endif
  27.  
  28. //防止重复包含头文件
  29. #ifndef HADE_H_
  30. #define HEAD_H_
  31. #endif
  32.  
  33. #if SYS == 1
  34.  
  35. #elif SYS == 2
  36.  
  37. #elif SYS == 3
  38.  
  39. #else
  40.  
  41. #endif
  42.  
  43. //较新编译器提供了defined()
  44. //如果定义了IBMPC宏,defined()则返回1,否则返回0
  45. #if defined (IBMPC)
  46.  
  47. #elif defined (VAX)
  48.  
  49. #elif defined (MAC)
  50.  
  51. #else
  52.  
  53. #endif
  54.  
  55. //空宏
  56. #define EMPTY
  57. #define LIMIT 400
  58. //取消之前的#define LIMIT定义
  59. #undef LIMIT
  60.  
  61. int main(int argc, char* argv[])
  62. {
  63. //内置的预定义宏
  64. printf("__DATE__: %s\n", __DATE__); //输出时间 Mmm dd yyyy
  65. printf("__FILE__: %s\n", __FILE__); //输出当前代码文件路径
  66. printf("__LINE__: %d\n", __LINE__); //输出当前源代码行号
  67. //printf("__STDC__: %d", __STDC__); //1:遵循C标准
  68. printf("__STDC_HOSTED__: %d\n", __STDC_HOSTED__); //1:本机环境
  69. //printf("__STDC_VERSION__: %d\n", __STDC_VERSION__);//199901L:支持C99标准,201112L:支持C11标准
  70. printf("__TIME__: %s\n", __TIME__);//当前时间 hh:mm:ss
  71. printf("__func__: %s\n", __func__);
  72.  
  73. //#line指令重置__LINE__和__FILE__宏报告的行号和文件名。
  74. #line 1000 // 把当前行号重置为1000
  75. #line 10 "cool.c" // 把行号重置为10,把文件名重置为cool.c
  76.  
  77. #if __STDC_VERSION__ != 201112l
  78. //#error Not C11
  79. #endif
  80.  
  81. system("pause");
  82. return 0;
  83. }


运行测试

111.png

示例:泛型选择(C11)

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h> //C99特性
  5. #include <string.h>
  6. #include <math.h>
  7. #include <ctype.h>
  8.  
  9. //泛型选择(C11)
  10. //根据X的类型来匹配值
  11. //例如,X是int类型,则返回"int"
  12. #define MYTYPE(X) _Generic((X), \
  13. int : "int", \
  14. float: "float", \
  15. double: "double", \
  16. default: "other" \
  17. )
  18.  
  19. int main(int argc, char* argv[])
  20. {
  21. int d = 5;
  22. printf("%s\n", MYTYPE(d)); //输出"int"
  23. printf("%s\n", MYTYPE(2.0*d)); //输出"double"
  24. printf("%s\n", MYTYPE(3L)); //输出"other"
  25. printf("%s\n", MYTYPE(&d)); //输出"other"
  26.  
  27. system("pause");
  28. return 0;
  29. }

标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号