简体   繁体   English

在C ++预处理器中组合两个#defined符号

[英]Combining two #defined symbols in C++ preprocessor

I want to do: 我想要做:

#define VERSION XY123
#define PRODUCT MyApplication_VERSION

so that PRODUCT is actually MyApplication_XY123. 所以PRODUCT实际上是MyApplication_XY123。 I have tried playing with the merge operator ## but with limited success... 我尝试过使用合并运算符##,但成效有限......

#define VERSION XY123
#define PRODUCT MyApplication_##VERSION

=> MyApplication_VERSION => MyApplication_VERSION

#define VERSION XY123
#define PRODUCT MyApplication_##(VERSION)

=> MyApplication_(XY123) - close but not quite => MyApplication_(XY123) - 关闭但不完全

Is what I want possible? 我想要的是什么?

Token pasting works with arguments to macros. 令牌粘贴使用宏的参数。 So try this 所以试试吧

#define VERSION XY123
#define PASTE(x) MyApplication_ ## x
#define PRODUCT PASTE(VERSION)

The ## operator acts before argument substitution has taken place. ##运算符参数替换发生之前起作用。 The classical solution is to use a helper: 经典的解决方案是使用帮助器:

#define CONCAT2(a, b) a ## b
#define CONCAT(a, b) CONCAT2(a, b)

CONCAT(MyApplication_, VERSION)

All problems in computer science can be solved by an extra level of indirection: 计算机科学中的所有问题都可以通过额外的间接来解决:

#define JOIN_(X,Y) X##Y
#define JOIN(X,Y) JOIN_(X,Y)
#define VERSION XY123
#define PRODUCT JOIN(MyApplication_,VERSION)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM