240722 #运算符,字符串化运算符
#运算符是一个预处理器运算符,被称为字符串化运算符(stringizing operator)
#define CEREAL_NVP(T) ::cereal::make_nvp(#T, T)
这里#T是C++什么用法,详细说明,类似的还有哪些其他用法
在 C++ 中,#T
是预处理器的一个操作,称为字符串化(stringification)。当你在预处理器指令中使用 #
符号和一个宏参数时,它会把该参数替换为一个字符串字面量。这通常用于宏定义中,以便在编译时生成包含变量名称的字符串。
字符串化(Stringification)用法
- 语法:
#
符号后面跟着宏参数名,如#T
。 - 作用:将宏参数替换为一个字符串字面量,即变量或宏的名称。
- 示例:
#define CEREAL_NVP(T) ::cereal::make_nvp(#T, T)
在这个宏定义中,当 CEREAL_NVP
被使用时,#T
会被替换为 T
的字符串表示,即 "T"
。
其他预处理器用法
-
宏定义(Macro Definition):
- 使用
#define
来定义宏。
- 使用
-
条件编译(Conditional Inclusion):
- 使用
#if
,#ifdef
,#ifndef
,#else
,#elif
, 和#endif
来包含条件性的代码。
- 使用
-
文件包含(File Inclusion):
- 使用
#include
来包含头文件或其他源文件。
- 使用
-
错误和警告(Error and Warning Directives):
- 使用
#error
和#warning
来生成编译时错误或警告。
- 使用
-
行控制(Line Control):
- 使用
#line
来设置当前源文件的行号。
- 使用
-
宏展开(Macro Expansion):
- 使用
#
或##
来连接宏参数,生成更长的标识符或操作符。
- 使用
-
字符串字面量运算(Stringizing Operator):
- 使用
#
将宏参数转换为字符串字面量。
- 使用
-
标记粘贴(Token Pasting Operator):
- 使用
##
来合并两个标记(tokens)。
- 使用
示例:标记粘贴
#define PASTE(x, y) x ## y
PASTE(MyType, _t) // 展开为 MyType_t
在这个示例中,##
操作符用于连接 MyType
和 _t
,生成新的标识符 MyType_t
。
注意事项
- 预处理器操作在编译之前执行,它们不修改代码的结构,而是生成新的源代码。
- 预处理器宏是编译时的文本替换,它们不进行类型检查或语义分析。
- 过度使用宏可能导致代码难以理解和维护,应谨慎使用。
通过了解这些预处理器的用法,你可以更有效地编写条件编译代码、生成可配置的模板代码等。
#include <iostream>
#define PRINT_TYPE_NAME(var) std::cout << #var << " is of type " << typeid(var).name() << std::endl;
int main()
{
int x = 10;
PRINT_TYPE_NAME(x);
return 0;
}
before
C/C++常见的预处理指令:
#空指令,无任何效果
#include包含一个源代码文件
#define定义宏
#undef取消已定义的宏
#if如果给定条件为真,则编译下面代码
#ifdef如果宏已经定义,则编译下面代码
#ifndef如果宏没有定义,则编译下面代码
#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个#if……#else条件编译块
#error停止编译并显示错误信息
#ifdef:
#ifdef A
//...
#endif // A
注意:#ifdef 和 #ifndef 只能单独使用,不能和逻辑与&&和逻辑或||运算符并用;
“与”的形式:
#if (defined A) && (defined B)
//...
#endif
“或”的形式:
#if (!defined A) || (!defined B)
//...
#endif
#if 和 #elif :
#if (defined A)
//...
#elif (defined B)
//...
#elif (defined C)
//...
#endif
#define 和 #if:
#define IS_TRUE (0)
#if IS_TRUE
#endif
https://www.cnblogs.com/zi-xing/p/4550246.html
https://blog.csdn.net/emdfans/article/details/50432545