C语言条件编译详解

条件编译

0.前言

  1. 本文的程序是在linux下测试通过的
  2. 本文的分析通过了下面的命令来查看预编译结果

    gcc -E filename.c -o filename.i

    这条命令的作用是生成预处理文件filename.i

    gcc -S filename.c -o filename.s

    这条命令的作用是生成预编译文件filename.s

    gcc -c filename.c -o filename.o

    这条命令的作用是生成汇编文件filename.o

1.使用情况

  1. 不同的产品线公用一份代码
  2. 区分编译产品的调试版和发布版

2.函数的包含

  • #if…#else…#endif
#define C 1
int main()
{
    #if(C == 1)
        printf("This is first printf...\n");
    #else
        printf("This is second printf...\n");
    #endif

    return 0;
}

在linux下也可以使用gcc -DC=1 filename.c -o filename执行,效果和上面相同

在gcc下 -D是进入宏的意思


  • if…else
#define C 1
int main()
{
    if(C == 1)
        printf("This is first printf...\n");
    else
        printf("This is second printf...\n");

    return 0;
}
  • 区别:

1.条件编译是预编译指令(最终预编译是只有一条printf),控制是否编译某段代码(确定的)
2.if…else是在运行时选择(最终有两条printf),分开执行某些代码

3.头文件的包含

  • 问题:

如果一个函数调用了一个头文件,同时这个头文件包含了另外一个头文件,那么在编译时会出现错误,意思为重复定义另外一个头文件的内容

  • 解决:

可以在被包含的头文件里使用条件编译(一般的编译器已经自动添加了)

#ifdef (_头文件名_H_)
#define (_头文件名_H_)
#endif

4.条件编译的使用

#ifdef DEBUG
    //宏定义日志文件
    #define LOG(s) printf("[%s:%d] %s\n", __FIEL__, __LINE__, s)
#else
    #define LOG(S) NULL
#endif

#ifdef Product
void f()
{
    printf("This is a Product!\n");
}
#else
void f()
{}
#endif

int main()
{
    LOG("Enter main...\n");
    f();

    printf("1 Query\n");
    printf("2 Record\n");
    printf("3 Delete\n");

    #ifdef Product  //高级查询
    printf("4 Product\n");
    printf("5 Services\n");
    printf("6 Exit\n");
    #else
    printf("4 Exit\n");
    #endif

    LOG("Exit main...\n");
    return 0;
}

你可能感兴趣的:(C/C++,c语言,条件编译,预处理)