【问题标题】:How to return a string from a MACRO function in C?如何从 C 中的 MACRO 函数返回字符串?
【发布时间】:2011-12-06 17:02:38
【问题描述】:

我想根据作为参数传递给 MACRO FUNCTION 的值创建一个字符串。 类似的东西:

#define ABC(x,y) return "anystr_x_y.tar.bz2"
main()
{
   a = ABC(2,3);
}

所以最后,它应该返回“anystr_2_3.tar.bz2”

我想知道如何使用作为参数传递给 MACRO fnc 的值创建该字符串。

任何帮助! 谢谢!

【问题讨论】:

    标签: c string macros c-preprocessor


    【解决方案1】:

    像这样定义你的宏,使用“字符串化操作符”:

    #define ABC(x,y) "anystr_" #x "_" #y ".tar.bz2"
    

    【讨论】:

    • 我虽然是 ## 用于令牌连接。还是 #x 不是 concat 而是别的什么?
    • @DavidHeffernan # 是字符串化的。在我的编译器上,连接是自动完成的(不需要##)。我以为这是标准的?
    • 谢谢。我刚刚学到了一些东西。我确定这是标准的,我出于无知而提出了这个问题!
    • 这是因为字符串是一种特殊情况,它们总是被自动连接起来。当你写x = "ABC" "DEF";时,它和写x = "ABCDEF";是一样的
    • 谢谢!我使用 ## 运算符而不是 #.
    【解决方案2】:

    宏不返回内容,因为它们不是函数。它们只是令牌替换功能。你真正想要的是一个,而在你的地方,我会用一个函数来代替。但是,解决方案可能如下所示:

    #define ABC(x,y) "anystr_" #x "_" #y ".tar.bz2"
    

    这利用了字符串文字被折叠在一起这一事实,因此"Hello " "World!" 被解释为"Hello World!"

    【讨论】:

    • @cnicutar:Boost Preprocessor库是基于C和C++共享的预处理器。
    • 正确,但是,为什么要使用 boost stringize,而普通的标准 stringize 可以呢? "anystr_" #x "_" #y ".tar.bz2"
    • 我不知道 Boost 预处理器库,也不知道它适用于 C :-)
    • @Suma:因为我不知道这样的功能。我会更新我的答案。
    【解决方案3】:

    在 C(或 C++)中没有宏函数之类的东西。在编译代码之前,宏由预处理器处理。您上面的示例代码将由编译器处理为:

    main()
    {
      a = return "anystr_x_y.tar.bz2"
    }
    

    要实现您想要做的事情,您需要告诉预处理器连接 x、y 和字符串的常量部分。您可以使用 ## 运算符执行此操作,例如:

    #define ABC(x,y) ("anystr_" ## x ## "_" ## y ## ".tar.bz2")
    

    这将导致以下代码被传递给编译器:

    main()
    {
      a = ("anystr_2_3.tar.bz2")
    }
    

    【讨论】:

    • 除非将xy 指定为"2""3",否则将导致错误。
    • 是的,这可能是最能从宏中得到的。其他的连接几乎没有你可以在预处理器中做的事情。但是,你 goo concat 错了,你需要使用 stringize 代替,连接是在字符串上自动完成的:("anystr_" #x "_" #y ".tar.bz2")
    • ## 是令牌粘贴运算符...不是字符串化。它应该在参数上使用单个#
    • @e8johan:非常感谢您的宝贵通报。这就是我要找的!
    猜你喜欢
    • 2015-05-11
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    相关资源
    最近更新 更多