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

时间:2010-08-03 20:09:10

标签: c macros

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

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

我会按如下方式调用它:

TEST(test1, TEST1)

将产生以下结果:

test_test1:
    TEST_TEST1_KEYWORD

现在,不必两次输入相同的名称(一次使用所有小写字符,再次使用所有大写字符),有没有办法可以执行以下任一操作,并将令牌更改为全部大写字母或全部小写字母?

TEST(test1) or TEST(TEST1)

谢谢, 莱恩

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:9)

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

#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

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

答案 2 :(得分:2)

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

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

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

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