c语言宏 转换字符串,c/c++宏展开成字符串

#include

// 连接标识符(非字符串连接成非字符串,字符串连接成字符串)

#define __JOIN(x,y) x##y

// 将参数转换成字符(x长度小于5,否则会溢出)

#define __CHAR(x) #@x

// 将x变成字符串(如果x是宏也不展开)

#define __S(x) #x

// 将x变成T字符串(如果x是宏也不展开)

#define __ST(x) _T(#x)

// 将x变成字符串(如果x是宏,展开)

#define _S(x) __S(x)

// 将x变成字符串(如果x是宏,展开)

#define _ST(x) __ST(x)

// 将参数连接并转成字符串(遇宏则展开)

#define _TO_STR(x, y) _S(x) "" _S(y)

#define _TO_STRT(x, y) _T( _S(x) "" _S(y) )

bool testStrMacro()

{

int ab = 12;

assert(__JOIN(1, 2) == 12); // 常量连接组合

assert(__JOIN("a", "b") == "ab"); // 字符串连接

assert(__JOIN(a, b) == 12); // 变量组合连接

auto a = __CHAR(65);

assert(a == '65');

assert(__CHAR(中国) == '中国');

auto cc = __CHAR(PNG);

assert(__CHAR(PNG) == 0x504e47);// PNG 的 hex即是 0x504e47

// 直接转成字符串

assert(__S(65) == "65");

assert(__ST(65) == _T("65"));

#define test a

#define test_s "a"

assert(__S(test) == "test"); // test是宏,但__S里有#,所以后续内容不展开

assert(__ST(test) == _T("test")); // test是宏,但__S里有#,所以后续内容不展开

// 宏展开转换成字符串

assert(_S(test) == "a");

assert(_ST(test) == _T("a"));

assert(_TO_STRT(test, 123) == _T("a123"));

assert(_TO_STR(test, 123) == "a123");

// 宏嵌套效果

auto b = _TO_STR(__S(test), 123);

assert(_TO_STR(__S(test), 123) == "\"test\"123");

auto c = _TO_STR(_S(test), 123);

assert(_TO_STR(_S(test), 123) == "\"a\"123"); //_S(test) 展开成了a

assert(_TO_STR(_S(test), _TO_STR(123, 456)) == "\"a\"\"123\" \"\" \"456\"");

return true;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值