C语言预处理命令#line、#error、#pragma、#ifndef等

C语言预处理命令

  • 1 我想把预处理命令分成3类
  • 2 三个陌生命令
    • 2.1 #line行控制
    • 2.2 #pragma留给具体实现
    • 2.3 #error错误信息输出
    • 2.4 #ifxxx条件编译
    • 2.4 书写语法
  • 3 #define的注意事项

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 书写语法

  1. #写在开头,如上!!!预处理命令顶头写
  2. 记号序列全部大写,具体库前面添加具体前缀,如:boost库的宏名全部以BOOST_打头
  3. 关于if的条件命令,一个指令一行,不允许多个命令写在一行

3 #define的注意事项

C语言宏替换#define中的#和##以及\
https://blog.csdn.net/weixin_39956356/article/details/112010237

你可能感兴趣的:(C进阶)