C中的特殊#define选项

时间:2019-05-02 10:51:24

标签: c c-preprocessor

我有一个结构A,使得A具有字段v0和v1。 有一个A数组:

A St[3];

我想这样定义B:

#define B[x] St[x].v0 

我无法插入x作为要定义的参数。 在C中有什么方法可以做到这一点吗? 我的目的是要用B [x]替换St [x] .v0的每个实例。

3 个答案:

答案 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 ++中的那个)。