条件编译与代码裁剪

1、条件编译的三种形式

(1)、判断存在

如果定义了宏 xxx 编译语句1,否则编译语句 2

#ifdef xxx
语句 1;
#else
语句 2;
#endif

(2)、判断不存在

如果没有定义宏 xxx 编译语句1,否则编译语句 2

#ifndef xxx       //不存在
语句1;
#else
语句2;
#endif

(3)、判断是否成立

如果 xxx 为真,编译语句1,否则编译语句 2

#if xxx
语句 1;
#else
语句 2;
#endif

2、条件编译的例子

(1)、没有定义宏执行语段2,将小写转换为大写

#include 
#include 
void test00()
{
    char str[128] = "";
    fgets(str, sizeof(str), stdin);
    str[strlen(str) - 1] = 0;
    int i = 0;
    while (str[i] != '\0')
    {
#ifdef MAX_TO_MIN // 大写转小写,因为没有定义该宏所以不执行代码段1,变暗
        if (str[i] >= 'A' && str[i] <= 'Z')
        {
            str[i] += 32;
        }
#else // 小写转大写
        if (str[i] >= 'a' && str[i] <= 'z')
        {
            str[i] -= 32;
        }
#endif
        i++;
    }
    printf("%s\n", str);
}
int main(int argc, char const *argv[])
{
    test00();
    return 0;
}

条件编译与代码裁剪_第1张图片

在这里插入图片描述

(2)、定义宏或者编译的时候传送宏(相当于定义宏),则执行语段1将大写转换为小写

条件编译与代码裁剪_第2张图片

3、条件编译方式 用于 防止头文件重复包含

条件编译与代码裁剪_第3张图片
条件编译与代码裁剪_第4张图片

条件编译与代码裁剪_第5张图片

edu@edu:~/work/c/day_04$ gcc 01_code.c -o 01    //编译01_code.c文件

条件编译与代码裁剪_第6张图片

由于在预编译的时候是将头文件中的内容直接复制到当前文件中,同时由于 01_b.h中引入了头文件01_a.h相当于在01_a.h中定义了全局变量 int num = 10 但是 01_b.h中也有全局变量 int num = 10,所以在 01_code.c中同时引入01_a.h和01_b.h时均包含 int num = 10,这样在编译的时候就会报上面重复定义的错误!!!!1

-----linux下使用条件编译解决头文件重复问题(固定写法)

条件编译与代码裁剪_第7张图片
条件编译与代码裁剪_第8张图片
条件编译与代码裁剪_第9张图片
条件编译与代码裁剪_第10张图片

你可能感兴趣的:(嵌入式开发学习,linux,服务器,物联网)