C++ #在函数C+中定义宏+;

C++ #在函数C+中定义宏+;,c++,function,c-preprocessor,C++,Function,C Preprocessor,我想知道是否有一种方法可以在函数中使用宏,例如,如果我们有这样一段代码: struct SomeStruct{ int fancyVariableNumberOne; int notSoFancyVar; }; void SomeFunction(SomeStruct *array) { #define w(i) array[i].fancyVariableNumberOne; ... } 我不想写数组[I]。每次FancyvariablenNumber我能不能

我想知道是否有一种方法可以在函数中使用宏,例如,如果我们有这样一段代码:

struct SomeStruct{
   int fancyVariableNumberOne;
   int notSoFancyVar;
};

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

   ...


}

我不想写数组[I]。每次FancyvariablenNumber我能不能在不改变结构的情况下缩短它?

宏是在编译之前定义的。只需在上面定义宏并在函数中使用它即可。预处理器将粘贴您在函数中定义的任何内容

例如:

#define w(i) array[i].fancyVariableNumberOne

void someFunction(SomeStruct *array)
{
    w(i);
}

是的,您可以定义和使用这样的宏。唯一的问题是宏的作用域不会仅限于该函数。它将在整个翻译单元中从此点开始可见(除非@MichaelKohne指出,您使用
unde
删除它)


与其使用宏,不如尝试使用内嵌函数。它将更加灵活,并有更少的意外副作用。

不要使用宏,您可能会有一些令人讨厌的意外副作用

而是使用lambda通过引用捕获
数组
,并使其返回
fancyVariableNumberOne
。C++11是必需的

void SomeFunction(SomeStruct *array)
{
    auto w=[&array](int i){return array[i].fancyVariableNumberOne;};
    std::cout<<w(0)<<std::endl;
}
void SomeFunction(SomeStruct*数组)
{
自动w=[&array](int i){返回数组[i].fancyVariableNumberOne;};

std::cout您可以创建包含SomeStruct数组的类,并重写[]运算符以返回每个数组的FancyVariableNumber

class SomeArray
{
SomeStruct *array;

public:
...
int operator[](int index)
{
return array[index].fancyVariableNumberOne;
}

};

SomeArray a;
...
int b = a[i];

改为使用
函数
。#define是预处理器保留字。它将用于编译,与执行无关…您需要typedef。我猜您为什么不在文件顶部定义w(i)
,然后调用
w(i)
在函数中?编译器是否拒绝了该代码?它应该可以工作,但您可能应该使用
#undef w
来完成函数体。如果OP确实在函数中使用了宏,那么函数末尾的
#undef w
至少可以防止它污染文件的其余编译。不错,但是编译什么呢现在rs支持这一功能吗?每个主流编译器.g++,MSVC,最著名的编译器在这里,我将研究这个自动功能。Tbh这是我第一次看到它。