C语言预处理命令#line、#error、#pragma、#ifndef等
程序员文章站
2024-02-22 16:13:04
...
C语言预处理命令
1 我想把预处理命令分成3类
如下3块内容
1. 以#define、#include的宏替换和文件包含
2. 以#ifxxx为首的一族条件编译命令
3. 其他三个陌生命令,如#line、#error、#pragma
总结:
第一点我们很熟悉,不在这里分析。但是涉及两个特殊用法,即#和##
,之后分享
第二点是条件编译的核心,一个简单的用法,同一份代码适用在不同操作系统上
第三点比较陌生,先来看看。
2 三个陌生命令
2.1 #line行控制
原理:该命令出现的行数
被强制改为一个整数
,之后的行数在此基础上计算,之前的行数不会改变,如果有文件名,同时文件名被强制改为新文件名。
作用:用于调试。
#line 一个整数 “文件名”
#line 一个整数
案例:
#line 100 "main.cpp" //指定当前行是100,更改文件名为main.cpp,用于调试,之前的行号没有影响
// 之后故意写一条错误代码
int a = 0 // 没有分号,观察输出!
2.2 #pragma留给具体实现
这个命令和具体实现有关,如果定义记号序列无效,那么这条命令失效
#pragma 记号序列
比如在vs中,可以看见下面的预处理命令
#pragma disable(warning:4996)
这个命令是VS内置的,表示将忽略4996号警告,比如使用printf()。
但是在GCC上也能编译过,不会带来任何实质的作用,无效记号会被忽略。
2.3 #error错误信息输出
一旦执行该命令,立即编译错误!!!
#error 字符串
一般而言,配合条件编译指令一起使用
如下,一个模板,定义了Windows符号,就执行XXX_1;定义了Linux符号,就执行XXX_2;否则编译错误,停止编译。
#ifdef windows_symbol
# define XXX_1
#elif Linux_symbol
# define XXX_2
#else
# error "These code only use at Windows or Linux"
2.4 #ifxxx条件编译
条件编译有非常重要的地位,比如同一份代码如何适应不同操作系统、兼容不同主、次版本代码、代码的输出配置形式等等。
一共有6个,它们的含义和if语句相似。
#if 常量表达式
#ifdef 标识符 // 等价 #if defined 标识符
#ifndef 标识符 // 等价 #if !defined 标识符
#elif 标识符
#else
#endif
2.4 书写语法
- #写在开头,如上!!!预处理命令顶头写
- 记号序列全部大写,具体库前面添加具体前缀,如:boost库的宏名全部以BOOST_打头
- 关于if的条件命令,一个指令一行,不允许多个命令写在一行