在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)
以上就是c/c++开发分享你能在宏中大写粘贴的令牌吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562745.html