C++编程中带#条件语句的用法和作用详解

1#和##的作用和用法 c/c++ 的宏中,#的功能是将其后面的宏参数进行字符串化操作,简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。##连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。
#include using namespace std;#define warn_if(exp) if(exp) cerr << #exp << endl;#define paster( n ) cout << token << #n << = << n << endl;#define _cons(a, b) int(a##+##b)#define _stri(s) #svoid main() { int div = 0; warn_if(div == 0); // prints : div == 0 paster(9); // prints : token9 = 9 cout << _cons(1, 2) << endl; // prints : 3 cout << _stri(int_max) << endl; // prints : int_max}
凡是宏定义里有用#或##的地方宏参数是不会再展开,例如_stri(int_max)中的int_max就不会被展开为2147483647。如果想要使其中的宏参数展开,则需要多加一层中间转换宏:
#define stri(s) _stri(s)cout << stri(int_max) << endl; // prints : 2147483647
加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的宏就能得到对应的宏参数。
接下来,我们来了解通过预处理指令创建条件编译参数控制代码编译的一些用法。
2#include的用法 包含头文件的操作,通常有两种格式:
#include #include header-file
和表示编译器在搜索头文件时的顺序不同:
表示从系统目录下开始搜索,然后再搜索path环境变量所列出的目录,不搜索当前目录
是表示从当前目录开始搜索,然后是系统目录和path环境变量所列出的目录。
所以,系统头文件一般用,用户自己定义的则可以使用,加快搜索速度。除此外,写代码多了就会发现,有些头文件之间的相互包含是有隐藏依赖关系的,一定要加以注意。google c++ style guide中也强调使用标准的头文件包含顺序可增强可读性, 避免隐藏依赖:
1 相关文件(优先位置,如dir2/foo2.h)2 c系统文件3 c++ 系统文件4 其他库的.h文件5 本项目内.h文件
3#if,#elif,#else,#endif用法
// structure 1#if constant_expression#else#endif// structure 2#if constant_expression#elif constant_expression#endif
这里的结构跟常见的if...else和if...else if...else语句类似,当#if后的条件为非零(true)时,编译#if和#else或#elif之间的代码,否则编译#else和#endif之间的代码(或者判断#elif后的条件是否非零(true),决定是否编译#elif和#endif之间的代码)。
#if 1 cout << hello world! << endl;#else cout << nice to meet you! << endl;#endif// prints : hello world!
#if 1 cout << hello world! << endl; #elif 1 cout << nice to meet you! << endl; #endif// prints: hello world!// nice to meet you!
4#define,#undef,#ifdef,#ifndef用法
#define是大家都常见的宏定义方法,用法结构为:
// #define identifier replacement-code#define pi 3.1415926#define add(x,y) (x + y)
#undef顾名思义,就是从该处取消前面已经定义的宏,如果标识符当前没有被定义称为一个宏名称,就会忽略该指令:
// #undef identifier#undef pi
#ifdef和#ifndef含义相反,前者含义为如果定义了该宏,则编译相应代码;后者则为如果没有定义该宏,则编译相应代码。通用结构为:
/* * #ifdef identifier * #else or #elif * #endif **/ #define debug#ifdef debug cout << this is a debug message. << endl;#endif// prints : this is a debug message./* * #ifndef identifier * #else or #elif * #endif **/ #ifndef debug cout << this is a debug message. << endl;#endif// prints nothing
在编程时,为了避免头文件重定义,经常使用的就是#define配合条件编译解决:
#ifndef my_header_file_h#define my_header_file_h// ...class myheaderfile { // ....};#endif // my_header_file_h
除此以外,还有#pragma once的用法,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。(在所有的预处理指令中,#pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作,本文不多讲述。)
5#line用法
#line命令是用于更改__line__和__file__变量的值。__file__和__line__描述被读取的当前文件和所在行数。
// #line line-number filenameint main() {#line 10 main.cpp cout << __file__ << << __line__ << endl; }// prints : main.cpp 10
6#error用法
#error会直接导致程序停止编译并输出指定的错误信息:
// #error message#ifndef version#error version number not specified.#endif// the compiler will halt compiling and return with the specified error message: // fatal error c1189: #error : version number not specifi

红外热成像助力海事安全
移远通信获ASPICE CL2国际认证 广和通共享两轮出行5G模组方案
紫光国微发挥科技创新力量 赋能社会数字化转型
“智能安防”提升城市管理水平
未来iPhone可能会使用的功能:苹果开发手势识别系统曝光
C++编程中带#条件语句的用法和作用详解
!销售/回收HP4285A HP 4285A信号源HP428
什么是氮化镓合封芯片科普,氮化镓合封芯片的应用范围和优点
提高SPI时钟时通信异常的案例分享
电感器常见种类有哪些:阻流电感器
三极管工作原理 3极管的三种工作状态判断方法
日本工业机器人业绩未达标的原因在于受贸易战影响
格力收购珠海银隆终止 董明珠造车梦碎!
基于TCP/IP通信服务的网络门禁系统的安装及方法
苹果搞事情_MacOS弹窗提醒抛弃32位应用
各种透明玻璃厚度测量
唯创知音WT2605C-A001音频蓝牙语音芯片:小巧体积,高品质音频播放的创新
串行端口在工业单板计算机中的应用
互联网医疗的发展趋势如何?其中存在哪些问题?
配置相同的两部手机努比亚Z17和360N5你选谁?努比亚Z17和360N5谁更性价比