宏观回报值

Ste*_*eng 1 c++ macros

宏可以返回一个对象吗?

#define macro1 {obj1}
Run Code Online (Sandbox Code Playgroud)

由于宏是文本替换,我可以像macro1.function1()一样使用宏吗?

谢谢.

Kor*_*icz 8

宏永远不会返回任何东西.宏返回代码的文本表示,该代码将被粘贴到编译之前使用它的程序所在的位置.

阅读有关C预处理器的信息.

所以:

#define macro1 {obj1}

int main() {
  macro1
}
Run Code Online (Sandbox Code Playgroud)

......将被编译,就像你写的一样

int main() {
  {obj1}
}
Run Code Online (Sandbox Code Playgroud)

它只是文本替换,可以选择带参数.


如果您正在使用GCC,您可以使用该cpp工具查看预处理后程序的外观:

# cpp myprog.cpp myprog.cpp_out
Run Code Online (Sandbox Code Playgroud)

通常将宏与对象混合是不好的做法,而是使用模板.


宏在对象方面的一种已知用法是使用它们来访问单例(但这通常不是一个好主意):

#define LOGGER Logger::getLogger()

...

LOGGER->log("blah");
Run Code Online (Sandbox Code Playgroud)

您还可以使用预处理器在编译时选择要使用的对象:

#ifdef DEBUG
#  define LOGGER DebugLogger
#else
#  define LOGGER Logger
#end

// assuming that DebugLogger and Logger are objects not types
LOGGER.log("blah");
Run Code Online (Sandbox Code Playgroud)

...但前面提到的模板做得更好.


dir*_*tly 6

宏在预处理步骤(编译的七个阶段的一部分)中触发文本替换.返回值在运行时发生.这个问题没有意义.