如何从C中的MACRO函数返回一个字符串?

问题描述:

我想根据作为MACRO FUNCTION参数传递的值创建一个字符串。 类似:如何从C中的MACRO函数返回一个字符串?

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

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

我想知道如何创建作为参数宏FNC传递的值的字符串。

任何帮助! 谢谢!

定义宏这样,使用 “stringize运营商”:

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

我虽然是令牌concat ##。或者#x不是concat,而是其他的东西? –

+0

@DavidHeffernan'#'是字符串。在我的编译器上,连接是自动完成的(不需要'##')。我认为这是标准? – cnicutar

+2

谢谢。我刚刚学到了一些东西。我确定它是标准的,我在无知的问题上问了我这个问题! –

在C(也就是C++)中没有这样的宏功能。编译代码之前,宏由预处理器处理。你的示例代码上面会由编译器进行处理,以这样的:

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

要达到什么样的你正在尝试做的,你需要告诉预处理器concattenate x,y和你的字符串常量部分。你这样做,使用##运营商,如:

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

这将导致下面的代码被传递到编译:

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

这将导致除非'x'错误和'y'被指定为' “2”'和' “3” '。 –

+0

是的,这可能是从宏观上可以得到的最多。在串联中,在预处理器中几乎没有什么可以做的。但是,你的连接错误,你需要使用字符串,而不是连接自动完成字符串:(“anystr_”#x“_”#y“.tar.bz2”) – Suma

+0

'##'是令牌粘贴操作符。 ..没有字符串化。它应该使用参数上的单个'#'。 –

宏不回东西,因为它们不是功能。它们只是令牌替换功能。你真正想要的是一个虽然一个,而在你的地方,我会用一个函数来做。然而,一个解决办法是这样的:

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

这需要从杠杆的事实,字符串文字togheter倒塌,所以"Hello " "World!"被解释为"Hello World!"

+0

这个标签不是'C'吗? – cnicutar

+0

@cnicutar:Boost预处理器库基于C和C++之间共享的预处理器。 –

+0

但是,正确的标准字符串大小的时候,为什么要使用boost字符串呢? “anystr_”#x“_”#y“.tar.bz2” – Suma