如何从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"
在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")
}
这将导致除非'x'错误和'y'被指定为' “2”'和' “3” '。 –
是的,这可能是从宏观上可以得到的最多。在串联中,在预处理器中几乎没有什么可以做的。但是,你的连接错误,你需要使用字符串,而不是连接自动完成字符串:(“anystr_”#x“_”#y“.tar.bz2”) – Suma
'##'是令牌粘贴操作符。 ..没有字符串化。它应该使用参数上的单个'#'。 –
宏不回东西,因为它们不是功能。它们只是令牌替换功能。你真正想要的是一个虽然一个,而在你的地方,我会用一个函数来做。然而,一个解决办法是这样的:
#define ABC(x,y) "anystr_" #x "_" #y ".tar.bz2"
这需要从杠杆的事实,字符串文字togheter倒塌,所以"Hello " "World!"
被解释为"Hello World!"
。
我虽然是令牌concat ##。或者#x不是concat,而是其他的东西? –
@DavidHeffernan'#'是字符串。在我的编译器上,连接是自动完成的(不需要'##')。我认为这是标准? – cnicutar
谢谢。我刚刚学到了一些东西。我确定它是标准的,我在无知的问题上问了我这个问题! –