如何在标头中连接字符串
How to concatenate strings in a header?
我想在一个专用的头文件中定义一堆常量。
由于某些前缀经常出现,我想定义它们一次,然后在需要时添加它们。
我的问题是:
如何在没有空格的情况下将前缀与另一个字符串连接?
示例:
#define PREFIX "pre_"
#define KEYWORD "keyword"
#define BOTH PREFIX+KEYWORD
BOTH的期望结果:pre_keyword
显然中的+
BOTH PREFIX+KEYWORD
不会起作用。那么,如何将这些令牌连接起来呢?
仅
#define BOTH PREFIX KEYWORD
相邻的文字会自动连接,因此
"pre_" "keyword"
将成为
"pre_keyword"
如果你想坚持使用宏,这是对正在发生的事情以及如何改进的简短解释。
#define PREFIX "pre_"
#define KEYWORD "keyword"
定义了两个宏,这两个宏将在预处理期间被它们的定义所取代。
#define BOTH PREFIX+KEYWORD
将被取代
"pre_"+"keyword"
导致指针添加,显然不是您想要的。正如在C和C++中一样,我们可以通过在不使用任何运算符的情况下将部分相邻写入来拆分C字符串(它们将被视为一个C字符串文字,而不是两个C字符串的级联):
"pre_" "keyword"
所以你希望宏是
#define BOTH PREFIX KEYWORD
如果在你的程序中经常使用这样的前缀,我建议使用以下方法:
#define PRE(x) "pre_" x
并使用"调用"宏
PRE("keyword")
其将扩展到CCD_ 1。
现在,如果"keyword"
总是一个编译时的C字符串,它可以写为标记(没有特殊字符),你甚至可以让它在没有引号的情况下工作:
#define PRE(x) "pre_" #x
#x
将把令牌x
"转换"为C字符串文字。然后,您可以编写以下内容:
PRE(keyword)
请注意,这是由预处理器完成的,因此keyword
甚至可以是C/C++关键字,并且它仍然有效,就像PRE(if)
一样。
为了完整性:如果您希望结果仍然是一个令牌,您可以使用预处理器运算符##
:执行令牌连接
#define PRE(x) pre_ ## x
然后,PRE(keyword)
将扩展到pre_keyword
。
相关文章:
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 这两个C++语句连接字符串有什么区别?
- 连接字符串族
- 如何使用 + 运算符连接字符串
- 如何按照 Google C++风格指南连接字符串文字?
- 我的字符串类的 += 运算符有问题,它没有正确连接字符串
- 如何编写模板函数来添加整数但连接字符串和字符类型?
- 无法创建栅格堆栈,因为我无法连接字符串(dir_name + 文件名)
- 如何在不使用对象的情况下连接字符串、整数和浮点数
- 在std :: string中连接字符串的选项
- 连接字符串的最佳方法是什么?
- 在实体框架C /CLI上配置连接字符串
- 在 c++ 中连接字符串和 int
- 如何连接字符串并传递给 system() 调用
- 有没有办法方便地为 Winsock send() 生成 HTTP 标头,而不是手动连接字符串
- 在可变参数模板函数中连接字符串(和数字)
- 连接字符串时出现意外问题
- 如何在 c++ 中连接字符串
- 自动连接字符串和 int C++
- 我的c++程序在我不告诉他的地方连接字符串