c/c++语言开发共享你能在宏中大写粘贴的令牌吗?

在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

      (0)
      上一篇 2021年2月5日
      下一篇 2021年2月5日

      精彩推荐