如何连接,评估和字符串化宏?

我试图对宏连接的替换(评估)进行字符串化。 例如:

#include  #define FOO_ONE 12 #define FOO_TWO 34 #define BAR_ONE 56 #define BAR_TWO 78 #define MAKE_MAC(mac) // ... what to do here? void main(int argc, char *argv[]) { printf("FOO: " MAKE_MAC(FOO) "\n"); printf("BAR: " MAKE_MAC(BAR) "\n"); } 

我想要的结果是:

 FOO: 1234 BAR: 5678 

我尝试了几种forms,我认为最好的尝试是这样的:

 #define STRINGIFY(mac) #mac #define CONCAT(mac1, mac2) STRINGIFY(mac1 ## mac2) #define MAKE_MAC(mac) CONCAT(mac, _ONE) CONCAT(mac, _TWO) 

但是,它只能让我这么远:

 FOO: FOO_ONEFOO_TWO BAR: BAR_ONEBAR_TWO 

那么,在得到字符串化之前,如何添加评估结果连接宏的额外步骤?

试试这个:

 #include  #define FOO_ONE 12 #define FOO_TWO 34 #define BAR_ONE 56 #define BAR_TWO 78 #define STRINGIFY(arg) #arg #define CONCAT(arg1, arg2) STRINGIFY(arg1) STRINGIFY(arg2) #define MAC(arg) CONCAT(arg##_ONE, arg##_TWO) int main(){ printf("FOO: " MAC(FOO) "\n"); printf("BAR: " MAC(BAR) "\n"); return 0; } 

我的输出:

 FOO: 1234 BAR: 5678 

您需要通过引入一个间接层来推迟字符串化:

 #define STRINGIFY_X(x) #x #define STRINGIFY(x) STRINGIFY_X(x) #define MAKE_MAC(mac) STRINGIFY(mac ## _ONE) STRINGIFY(mac ## _TWO) 

wandbox.org上的实例