你能在宏中大写粘贴的令牌吗?

在C宏中,是否可以大写粘贴的令牌? 例如,我目前有以下宏:

#define TEST(name, keyword) \ test_##name: TEST_##keyword##_KEYWORD 

我会调用如下:

 TEST(test1, TEST1) 

这会产生以下结果:

 test_test1: TEST_TEST1_KEYWORD 

现在,不是必须两次输入相同的名称(一次使用所有小写字符,再次使用所有大写字符),有什么方法可以执行以下任一操作,并将标记更改为全部大写字母还是所有小写字母?

 TEST(test1) or TEST(TEST1) 

谢谢,瑞恩

据我所知,C预处理器(至少ISO / ANSI标准)中唯一可以对令牌进行的操作是替换,’stringify’或连接它们。 我也没有意识到任何可以让你做你想做的GCC或MSVC扩展。

然而,人们已经想出了一些聪明的(或奇怪的)方法来用宏来做神奇的(或可怕的)事情,所以如果有人给我带来惊喜,我也不会感到惊讶。

您可以执行以下操作(未经测试,可能是拼写错误…)

 #define NORMALIZE(TOK) NORMALIZE_ ## TOK 

然后对于每一个可能发生的着作都做了

 #define NORMALIZE_test1 test1 #define NORMALIZE_TEST1 test1 

然后在你的真实宏中使用NORMALIZE

 #define TEST(name, keyword) \ test_ ## NORMALIZE(name): \ TEST_ ## NORMALIZE(keyword) ##_KEYWORD 

(但也许你必须做一些中间辅助宏,直到你得到所有连接权)

这是不可能的,因为预处理器在pp-token的输入流上工作,并且没有允许您以有意义的方式分解这些的构造。

预处理器具有的构造是用宏扩展替换pp-token ,连接它们,(完全)删除它们等。

这意味着你对大写字母的唯一希望是从单个字符开始,然后将这些字符大写,然后将所有内容粘合在一起。 大写单个字符非常简单,因为您只有一个有限的集合可以使用。 另一方面,将它们粘合在一起是可能的,至少如果你将自己限制在一个固定的最大长度。 你最终会得到一个像这样使用的宏:

 TEST(t,e,s,t,1)