我有一个结构A,使得A具有字段v0和v1。 有一个A数组:
A St[3];
我想这样定义B:
#define B[x] St[x].v0
我无法插入x作为要定义的参数。 在C中有什么方法可以做到这一点吗? 我的目的是要用B [x]替换St [x] .v0的每个实例。
答案 0 :(得分:2)
替换参数的宏称为类函数宏,而C标准仅使用括号而不是方括号来提供类函数宏。
您可以使用以下方法:
#define B(x) St[x].v0
答案 1 :(得分:2)
根据the C reference,#define
的定义为
#define <identifier>[( parameters, ... )] [replacement-list]
您不得在<identifier>
中使用方括号(请参阅C99 standard),因此预处理器将无法正确处理您建议的解决方案。
相反可行的是
#define B(x) St[x].v0 // note the brackets
,您将在其中将其他参数传递给宏(使用括号)。 但是,这会混淆您的代码,并且极有可能使您的代码的用户/阅读者感到困惑。另请参见why you should be careful with macros。
答案 2 :(得分:1)
你可以拥有
#define B(x) St[x].v0
ant然后将St[x].v0
的每个实例替换为B(x)
。
恐怕不可能用[]
来做到这一点,为此您需要运算符重载(例如C ++中的那个)。