函数C ++中的#Define宏

时间:2014-01-17 13:19:56

标签: c++ function c-preprocessor

我想知道是否有办法在函数中使用宏,例如,如果我们有这样的代码:

struct SomeStruct{
   int fancyVariableNumberOne;
   int notSoFancyVar;
};

void SomeFunction(SomeStruct *array)
{
   #define w(i) array[i].fancyVariableNumberOne;

   ...


}

我不想每次都写array[i].fancyVariableNumberOne,我可以在不改变结构的情况下缩短它吗?

4 个答案:

答案 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];