c/c++语言开发共享将数字转换为宏中的字符串


可能重复:
将预处理程序标记转换为字符串

#define num 1234 

我想基于num定义一个“const char *”,在样本中它将是:

 #define num_str "1234" 

我可以写一个宏语句来实现这个目的吗? 注意:1234将被更改。

谢谢。

    是的,你可以,但宏替换可能有点奇怪。 双宏替换是有原因的,如果你考虑一段时间,就会明白为什么需要它。

     #define STRINGIZER_(exp) #exp #define STRINGIZER(exp) STRINGIZER_(exp) #define NUM 1234 int main(int argc, char *argv[]) { const char *p = STRINGIZER(NUM); printf("%sn",p); return EXIT_SUCCESS; } 

    运行这个:

     1234 

    双重替换的原因:乍一看,人们可能认为这将解决问题:

     #define STRINGIZER(exp) #exp #define NUM 1234 int main(int argc, char *argv[]) { const char *p = STRINGIZER(NUM); printf("%sn",p); return EXIT_SUCCESS; } 

    但这会产生:

     NUM 

    这不是我们想要做的。 如果您想首先实际扩展NUM宏,那么您必须这样做:强制扩展。 通过强制预处理器首先通过中间扩展替换(如我在此答案的顶部所示),首先展开传入的宏, 然后进行字符串化。

    侧栏:此技术对于生成预定义预处理器宏的宽字符版本特别有用,否则它们将保留常规字符串。 例如, __FILE__宏。 假设你想要一个宽字符版本的这个(一个前缀为’L’的字符串)你可能首先想到这会起作用:

     #define WIDESTR(str) L##str 

    但是使用__FILE__扩展,如下所示:

     const wchar *p = WIDESTR(__FILE__); 

    将导致编译器错误: "Undefined identifier: L__FILE__"

    那我们怎么解决这个问题呢? 和我们上面做的一样。

     #define WIDESTR_(str) L##str #define WIDESTR(str) WIDESTR_(str) int main(int argc, char *argv[]) { const wchar_t* p = WIDESTR(__FILE__); wcout << p << endl; return EXIT_SUCCESS; } 

    在我的系统上,这会产生:

     /Users/craig/tmp/main/main/test.cpp 

    在结束...

    作为一个安慰奖,我们将这个答案中的所有内容组合成一个巨大的堆叠,当我们这样做时,我们认为会发生什么:

     int main() { const wchar_t *p = WIDESTR(STRINGIZE(NUM)); wcout << p << endl; return EXIST_SUCCESS; } 

    如何在代码的其余部分中使用该字符串? 它必须是一个字符串宏吗? 从其他值创建字符串的标准方法是使用string.h中的sprintf()

     #define num 1234 sprintf(string,"%d",num); 

      以上就是c/c++开发分享将数字转换为宏中的字符串相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562264.html

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

      精彩推荐