在C宏中,是否可以大写粘贴的令牌?例如,我目前有以下宏:
#define TEST(name, keyword) \
test_##name:
TEST_##keyword##_KEYWORD
我会按如下方式调用它:
TEST(test1, TEST1)
将产生以下结果:
test_test1:
TEST_TEST1_KEYWORD
现在,不必两次输入相同的名称(一次使用所有小写字符,再次使用所有大写字符),有没有办法可以执行以下任一操作,并将令牌更改为全部大写字母或全部小写字母?
TEST(test1) or TEST(TEST1)
谢谢, 莱恩
答案 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)