• C语言预处理


    C语言预处理

    无参宏定义

    1、无参宏的宏名后不带参数,一般格式为

    #defind 标识符 字符串
    
    • 1
    • 字符串可以是常量、表达式

    2、举例

    #define PI 3.14
    #define EXP x*10*1.5
    
    • 1
    • 2

    编译器在处理时,会将源程序中所有的PI替换为3.14,将所有的EXP替换为表达式x*10*1.5

    #include 
    
    #define PI 3.14
    #define EXP x*10*1.5;
    
    int main() {
        float cycle = PI * 10 * 10;
        float r;
        r = EXP;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用命令gcc -E main.c -o main.i对文件进行预编译

    # 6 "array.c"
    int main() {
        float cycle = 3.14 * 10 * 10;
        float r;
        r = x*10*1.5;;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    有参宏定义
    • C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数

    • 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为

      #define 宏名(形参表) 字符串
      
      • 1
    • 示例

      #include 
      
      #define F(x) x*x*x;
      
      int main() {
          int result = F(3);
          return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 预编译

      # 5 "array.c"
      int main() {
          int result = 3*3*3;;
          return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5

    宏定义注意事项

    • 如果定义的字符串是表达式,表达式中的变量需要用()包起来,因为在预处理阶段宏展开时,可能会用表达式来替换宏定义中的变量

      #define F(x) (x)*(x)*(x)
      
      • 1
    • 不加括号效果演示

      #define F(x) x*x*x;
      
      int main() {
          int result = F(3+2);
          return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      # 5 "array.c"
      int main() {
          int result = 3+2*3+2*3+2;;
          return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
    文件包含

    C语言中的文件包含命令例如:#include ,文件包含语法格式如下

    #include <文件名>
    #include "文件名"
    
    • 1
    • 2

    注意

    • 使用尖括号表示在开发环境的头文件目录下查找,而不是源文件目录去查找
    • 使用双引号则表示首先在当前的源文件目录中查找,如果没有裁到包含的目录中查找
    • "文件名"可以是相对路径,也可以是绝对路径,建议不要使用绝对路径
    条件编译

    常用条件编译指令

    条件编译指令说明
    #if如果条件为真,则执行响应操作
    #elif如果前面的条件为假,而该条件为真,则执行相应操作
    #else如果前面条件均为假,则执行响应操作
    #endif结束响应的条件编译指令
    #ifdef如果该宏已定义,则执行响应操作
    #ifndef如果该宏没有定义,则执行响应操作

    示例

    #include 
    
    #define debug 0;
    
    int main() {
    #ifdef debug
        printf("debug\n");
    #else
        printf("no debug\n");
    #endif
    
    #if 0
        int a=10;
    #endif
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 注意:ifdef后跟宏名称,而不是变量名,必须以#endif结尾
  • 相关阅读:
    t-sne 数据可视化网络中的部分参数+
    Servlet简单项目操作
    STM32F4_HAL_LWIP_RAM接口UDP实验
    基于django | 创建app,并启动django
    竹纤维家装元宇宙:虚拟空间与绿色生活的融合
    浏览器输入URL后到服务器返回数据大体过程
    Netty中ctx.channel().close()与ctx.close的区别
    java毕业设计—— 基于java+JPA+jsp的进销存管理系统设计与实现(毕业论文+程序源码)——进销存管理系统
    C语言中的自定义类型详解(结构体 + 枚举 + 联合(共用体))
    1422. 分割字符串的最大得分
  • 原文地址:https://blog.csdn.net/qq_52751442/article/details/133378509