预处理指令

本文介绍了C语言中的预处理指令,如宏定义、文件包含、条件编译(#if…#elif…#else…)以及预定义宏(__DATE__,__TIME__,__FILE__,__LINE__,__func__,__STDC__,__STDC_HOSTED__,__STDC_VERSION__),展示了宏的使用、条件判断在开发中的应用以及如何避免文件重复加载。
摘要由CSDN通过智能技术生成

预处理指令

 从指令出现的地方 到文件末尾有效 一般默认放到开头
指令结尾处不需要分号
\可以折行 

#include 加载其他源码文件

支持路径的形式 
顺序没有关系 
#include <stdio.h>  <> 一般是系统自带的
#include "file.h"   "" 一般是用户定义的 

#define 宏

定义
将指定的词换成另一个词 
一般来说,应该首先使用函数,它的功能更强、更容易理解。宏有时候会产生意想不到的替换结果
可读性差 
字符串替换或简单的操作时 性能会好很多 
同一个宏不允许重复定义
宏的替换 不涉及数据类型
//使用1 基本宏 
#define MAX 100  // 将下面代码中出现MAX的地方 替换成100 
#define AAX MAX * MAX // 支持宏嵌套宏 
 //将下文的 MAX换成100  将AAX 换成 100 * 100

// 使用2 带参数宏1
#define SQUARE(X) X*X
// 示例1 
int i = SQUARE(2)  
   // 替换为 int i = 2 * 2;
// 示例2 
int i = SQUARE(3+4)
   // 替换为 int i = 3+4 * 3+4 结果为19 

// 使用3 带参数宏2
#define SQUARE(X) ((X) * (X))
//示例1 
int i = SQUARE(3+4)
   // 替换为 int i = (3+4) * (3+4) 结果为49 

// 使用4 不定参数 
#define X(a, b, ...) (10*(a) + 20*(b)), __VA_ARGS__
    //... 表示剩余的参数 
    //__VA_ARGS__ 实际获取到的参数 
    //#__VA_ARGS__ 让输出变成一个字符串 
//示例 
X(5, 4, 3.14, "Hi!", 12)
   // 替换成 (10*(5) + 20*(4)), 3.14, "Hi!", 12)
       
//define中 #和##运算符 
// # 替换后的值是字符串 
#define STR(x) #x
printf("%s\n", STR(3.123)); 结果为 printf("%s\n","3.123")
// ## 参数和其他标识符连在一起  一个主要用途是批量生成变量名和标识符
#define MK_ID(n) i##n
int MK_ID(1) 结果为 int i1;

#undef 取消宏

定义 
   取消不存在的宏 不报错
    不确定是否以前定义过,就可以先用#undef取消,然后再定义
使用 
    #undef MAX

预定义宏

没有一个一个试,直接从书中复制过来
__DATE__:编译日期,格式为“Mmm dd yyyy”的字符串(比如 Nov 23 2021)。
__TIME__:编译时间,格式为“hh:mm:ss”。
__FILE__:当前文件名。
__LINE__:当前行号。
__func__:当前正在执行的函数名。该预定义宏必须在函数作用域使用。
__STDC__:如果被设为1,表示当前编译器遵循 C 标准。
__STDC_HOSTED__:如果被设为1,表示当前编译器可以提供完整的标准库;否则被设为0(嵌入式系统的标准库常常是不完整的)。
__STDC_VERSION__:编译所使用的 C 语言版本,是一个格式为yyyymmL的长整数,C99 版本为“199901L”,C11 版本为“201112L”,C17 版本为“201710L”。

#if…#elif…#else…#endif

预处理器的条件判断,满足条件时,内部的行会被编译,否则就被编译器忽略
条件可以是  宏  表达式 
用于DEBUG模式 或什么环境加载什么文件
#if 0  // 这种写法也常用来当做注释写 
    const double pi = 3.1415; // 不会执行
#endif

#ifdef…#else…#endif 判断某个宏是否定义过

通过这个宏,判断库文件是否被加载了防止多次加载相同文件 
只是检查宏是否定义 不检查宏值是 
// #ifdef 等同于 #if define 
#if define 宏 

 #elif define 宏2 

 #else 
 #endif  

#ifndef…#endif 判断这个宏没有被定义过

防止重复加载
等同于 #if !define 
#ifndef MYHEADER_H
    #define MYHEADER_H
    #include "myheader.h" // 如果没定义过宏 则加载某文件 
#endif

其他

#line num(100) 
    下一行的行号重置成数字 并从数字开始 
    #line 100 "newFilename"
        不仅改行号 还改文件名 
#error Not C11
    抛出错误 并终止编译 
#pragma 
    修改编译器属性 
    #pragma c9x on   让编译器以C99 标准进行编译
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hamburgerV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值