C语言预处理

C语言预处理

无参宏定义

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

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

2、举例

#define PI 3.14
#define EXP x*10*1.5

编译器在处理时,会将源程序中所有的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;
}

使用命令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;;
}
有参宏定义
  • C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数

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

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

    #include 
    
    #define F(x) x*x*x;
    
    int main() {
        int result = F(3);
        return 0;
    }
    
  • 预编译

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

宏定义注意事项

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

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

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

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

#include <文件名>
#include "文件名"

注意

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

常用条件编译指令

条件编译指令 说明
#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;
}
  • 注意:ifdef后跟宏名称,而不是变量名,必须以#endif结尾

你可能感兴趣的:(C,c语言)