C语言 预处理 + 条件编译宏 + 井号运算符

2023-12-14 17:56:40

预处理阶段任务

在这里插入图片描述

预处理指令

在这里插入图片描述

条件编译宏

条件编译宏的作用在于根据编译时的条件进行代码的选择性编译,从而实现不同环境不同配置不同功能的编译版本。

这可以用于实现调试模式发布模式的切换,平台适配,以及选择性地编译不同的功能模块等。通过合理使用条件编译宏,可以提高代码的灵活性可维护性可移植性

1
//#ifdef 和 #ifndef:这指令用于判断某个宏是否已经被定义。
#ifdef DEBUG
    // 定义了 DEBUG 宏对应的代码块
#else
    // 没有定义 DEBUG 宏对应的代码块
#endif
//判断出当前是不是WIN32平台。
#include <stdio.h>

int main()
{
#ifdef _WIN32
    printf("这是win32平台\n");
#else
    printf("这不是win32平台\n");
#endif // _WIN32
}
2
//#if:该指令用于在编译时对表达式进行求值,根据结果判断是否编译代码块中的内容。
//此处的表达式要求在预处理阶段值是可以被求出的,常见的包括宏定义的值、常量、运算表达式等。

#if (VALUE == 1)  // 小括号可以省略不写
    // 在VALUE为1时执行的代码
#elif (VALUE == 2)
    // 在VALUE为2时执行的代码
#else
    // 在其他情况下执行的代码
#endif
//根据宏 VALUE 的值,编译器会根据条件选择性地编译 #if、#elif 或 #else 后面的代码块。
#define VALUE 5
int main()
{
    int number = 5;
#if VALUE > 5
    number += 10;
#elif VALUE < 5
    number *= 10;
#else
    number++;
#endif 
    printf("number = %d\n", number);
}

pragma

#pragma 是C和C++语言中的一个预处理指令,用于向编译器发出特定的指示或命令

//用于防止头文件的重复包含
#pragma once
// 头文件的内容
//#pragma pack:用于设置结构体的内存对齐方式。#pragma pack 可以设置结构体成员的对齐方式,以便在内存中紧凑地存储数据。

// 将当前的对齐方式压栈,并设置为 n 字节对齐
#pragma pack(push, n)   
// 结构体定义和成员
#pragma pack(pop)       // 恢复之前的对齐方式
//#pragma warning:用于控制编译器警告的输出级别。#pragma warning 可以修改编译器输出的警告信息级别。

// 禁用指定警告
#pragma warning(disable: warning_number)   
// 恢复指定警告到默认级别
#pragma warning(default: warning_number)   

实际上各个编译器还支持各种不同的 pragma 指令,具体的使用方法和支持的指令可以参考编译器的文档或手册。需要注意的是,pragma 指令的具体行为和效果在不同的编译器之间可能有所不同,并且使用 pragma 指令可能导致代码的可移植性降低。因此,在使用 pragma 指令时应当谨慎,并考虑平台和编译器的兼容性。

井号运算符 ‘#’

在C和C++中,# 运算符(井号运算符)用于将宏参数转换为字符串常量

#include <stdio.h>
#define STRINGIZE(x) printf(""#x" value is %d\n", (x))

int main() 
{
    int number = 666;
    STRINGIZE(number);

    return 0;
}

输出:
number value is 666

在这里插入图片描述

拼接运算符 ‘##’

是宏预处理运算符,称为连接运算符拼接运算符。它只能在宏定义中使用,用于将两个符号(可以是标识符、关键字或其他字符)连接在一起形成一个新的标识符

#include <stdio.h>
#define NAME(n) yyds##n
#define STRNAME(n) "yyds_"#n""
#define STRINGIZE(x) printf("yyds"#x" value is %d\n", yyds##x)

int main() 
{
    int NAME(1) = 100;
    int NAME(2) = 200;
    int NAME(3) = 300;
    STRINGIZE(1);
    STRINGIZE(2);
    STRINGIZE(3);

    printf("%s\n", STRNAME(Leifeng));
    printf("%s\n", STRNAME(9527));

    return 0;
}

输出:
yyds1 value is 100
yyds2 value is 200
yyds3 value is 300
yyds_Leifeng
yyds_9527

在这里插入图片描述

详细教程可转

爱编程的大丙

文章来源:https://blog.csdn.net/CYS_2020/article/details/134917102
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。