C/C++预处理指令

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"

其他预处理器用法

  1. 宏定义(Macro Definition)

    • 使用 #define 来定义宏。
  2. 条件编译(Conditional Inclusion)

    • 使用 #if, #ifdef, #ifndef, #else, #elif, 和 #endif 来包含条件性的代码。
  3. 文件包含(File Inclusion)

    • 使用 #include 来包含头文件或其他源文件。
  4. 错误和警告(Error and Warning Directives)

    • 使用 #error#warning 来生成编译时错误或警告。
  5. 行控制(Line Control)

    • 使用 #line 来设置当前源文件的行号。
  6. 宏展开(Macro Expansion)

    • 使用 ### 来连接宏参数,生成更长的标识符或操作符。
  7. 字符串字面量运算(Stringizing Operator)

    • 使用 # 将宏参数转换为字符串字面量。
  8. 标记粘贴(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值