宏观回报值

时间:2010-08-30 07:34:56

标签: c++ macros

宏可以返回一个对象吗?

#define macro1 {obj1}

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

感谢。

5 个答案:

答案 0 :(得分:8)

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

了解C Preprocessor

所以:

#define macro1 {obj1}

int main() {
  macro1
}

...将被编译,就好像你写了

一样
int main() {
  {obj1}
}

这只是文本替换,可以选择带参数。


如果你正在使用GCC,你可以使用cpp工具查看预处理后程序的样子:

# cpp myprog.cpp myprog.cpp_out

通常将宏与对象混合是不好的做法,请改用templates


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

#define LOGGER Logger::getLogger()

...

LOGGER->log("blah");

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

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

// assuming that DebugLogger and Logger are objects not types
LOGGER.log("blah");

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

示例的宏将文本macro1替换为{obj1}。它只用其他文本替换文本;它不知道对象或类的概念。

答案 3 :(得分:1)

您可以随时查看编译器在定义宏(并调用它)时所执行的操作。宏的代码只需替换(就像复制粘贴一样)。
用gcc -E编译。 例如,此代码

#define macro1 {obj1}

int main() {
int obj1;
macro1
}

在使用 gcc -E example.c 进行编译时,我得到以下输出

# 1 "macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "macro.c"



int main() {
int obj1;
{obj1} //here your call gets expanded
}

答案 4 :(得分:0)

在C ++函数意义上,函数宏不是真正的函数:它们只是预处理指令。

预处理器首先读取您的源文件,处理(扩展,替换等)宏,然后将结果源提供给编译器。

因此宏不仅仅是源文件中文本的“复制粘贴”。因此,您可以使用包含return语句的宏,但它只会在您的代码中被替换。

另见Function-like macros