欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-22 16:13:04
...

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的条件命令,一个指令一行,不允许多个命令写在一行
相关标签: C进阶