单行注释
//单行注释
多行注释
/*
多行注释,不支持嵌套
*/
条件编译实现嵌套注释
#if 0
示例
#if 0
表达式永远为假,因此下面的代码块将不会被编译:
#if 0
// 这段代码将不会被编译
void this_function_will_not_compile() {
// 永远不会执行
}
#endif
这可以用于临时移除代码块,而不必删除它们,或者在不编译某些代码的同时保留注释。
在C++中,预处理器(preprocessor)是一个在编译之前运行的工具,它执行一系列的文本替换操作。#if
和 #endif
是预处理器指令的一部分,用于条件编译。条件编译允许你根据不同的条件包含或排除代码块。
预处理器指令 #if
和 #endif
#if
指令后面通常跟着一个表达式,预处理器会计算这个表达式的值。- 如果表达式的结果为真(非零),则编译器会编译
#if
和#else
(如果有的话)之间的代码。 - 如果表达式的结果为假(零),则会跳过这段代码,编译
#else
(如果有的话)和#endif
之间的代码。 #endif
用于结束条件编译块。
示例
假设我们想根据编译时定义的宏来决定是否包含某个特性:
#define FEATURE_X 1
#if FEATURE_X
// 如果FEATURE_X定义了,并且为真,则包含这段代码
void featureX_function() {
// 实现特性X的功能
}
#else
// 如果FEATURE_X没有定义或为假,则包含这段代码
void alternative_function() {
// 实现替代功能
}
#endif
在这个例子中,如果FEATURE_X
被定义了(例如通过命令行参数 -DFEATURE_X=1
),那么featureX_function
将被编译。如果没有定义FEATURE_X
或定义为0,则会编译alternative_function
。
多条件编译
预处理器还支持#ifdef
、#ifndef
、#elif
和#else
等指令,允许更复杂的条件判断:
#ifdef
:如果定义了某个宏,则编译后面的代码。#ifndef
:如果没有定义某个宏,则编译后面的代码。#elif
:如果前面的#if
或#elif
表达式为假,并且当前表达式为真,则编译后面的代码。#else
:如果前面的#if
或#elif
表达式都为假,则编译后面的代码。
示例
#define DEBUG 1
#if DEBUG
// 如果DEBUG定义且为真,则包含这段调试代码
#define LOG(msg) std::cout << msg << std::endl
#elif defined(RELEASE)
// 如果RELEASE定义,则使用简化的日志功能
#define LOG(msg) std::cout << "RELEASE: " << msg << std::endl
#else
// 如果两者都未定义,则禁用日志功能
#define LOG(msg)
#endif
int main() {
LOG("Hello, World!"); // 根据宏定义的不同,日志行为也会不同
return 0;
}
在这个例子中,根据DEBUG
或RELEASE
宏的定义,LOG
宏的行为会有所不同。