2010-08-03 62 views
25

在一个C宏中,是否可以利用粘贴的令牌?例如,我现在有下面的宏:您可以在宏中使用粘贴的令牌吗?

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

我将调用此如下:

TEST(test1, TEST1) 

这将产生以下:

test_test1: 
    TEST_TEST1_KEYWORD 

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

TEST(test1) or TEST(TEST1) 

感谢, 瑞安

+0

我已经看到了非常大的老代码重复很多单词在小写和大写达到你想要的东西。我从中猜测这是不可能的。 – 2016-04-05 12:04:27

回答

8

据我所知,可对令牌在C预处理器来完成(至少ISO/ANSI标准)唯一的操作就是更换,“字符串化'或连接它们。我也不知道任何GCC或MSVC扩展,可以让你做你想做的。但是,人们一直在用巧妙的(或古怪的)方式来用宏来做神奇的(或可怕的)事情,所以如果有人让我惊讶,我不会感到惊讶。

+0

谢谢,迈克尔。这几乎是我期待的,但我希望有人能让我感到惊讶。 =) – DuneBug 2010-08-03 20:38:18

7

你可以做类似如下(未经测试,可能错别字......)

#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 

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

+0

哈!哈!你做错了...他希望'TEST(name)'这样你就可以拥有'#define NORMALIZE_TEST1_UPPER TEST1',然后'#define NORMALIZE_TEST1_LOWER test1',然后使用TEST和大写版本'TEST(TEST1)'。 (你当然可以用小写字母来做同样的事情,取决于你想如何调用你的'TEST()'宏。) – 2014-08-17 03:28:38

1

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

什么预处理器是构建与宏展开来代替pp-token S,将它们连接起来,将其删除(完全)等

这意味着你的uppercasing唯一的希望是先从单个字符和大写这些和然后把所有东西粘在一起将个别字符大写非常简单,因为您只能使用有限的集合。另一方面将它们胶合在一起是可能的,至少如果你将自己限制在固定的最大长度。你会在想这可以使用微距端可达:

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