我想知道是否有办法在函数中使用宏,例如,如果我们有这样的代码:
struct SomeStruct{
int fancyVariableNumberOne;
int notSoFancyVar;
};
void SomeFunction(SomeStruct *array)
{
#define w(i) array[i].fancyVariableNumberOne;
...
}
我不想每次都写array[i].fancyVariableNumberOne
,我可以在不改变结构的情况下缩短它吗?
答案 0 :(得分:2)
是的,您可以定义和使用这样的宏。唯一的问题是宏不会仅限于该功能。从整个翻译单元的那一点开始就可以看到(除非@MichaelKohne指出,你使用undef
删除它。)
尝试使用内联函数,而不是使用宏。它将更灵活,并且具有更少的意外副作用。
答案 1 :(得分:2)
不要使用宏,你可能会有一些令人讨厌的意外副作用。
而是使用lambda通过引用捕获array
并使其返回fancyVariableNumberOne
。需要C ++ 11
void SomeFunction(SomeStruct *array)
{
auto w=[&array](int i){return array[i].fancyVariableNumberOne;};
std::cout<<w(0)<<std::endl;
}
答案 2 :(得分:1)
宏在编译之前定义。只需define
上面的宏,并在您的函数中使用它。预处理器将粘贴您在函数中定义的任何内容。
例如:
#define w(i) array[i].fancyVariableNumberOne
void someFunction(SomeStruct *array)
{
w(i);
}
答案 3 :(得分:0)
您可以创建包含SomeStruct数组的类,并覆盖[]运算符以返回每个类的fancyVariableNumberOne。
class SomeArray
{
SomeStruct *array;
public:
...
int operator[](int index)
{
return array[index].fancyVariableNumberOne;
}
};
SomeArray a;
...
int b = a[i];