宏返回值
宏从不返回任何内容。宏将返回代码的文本表示,该代码将在编译之前被粘贴到程序所在的位置。
阅读关于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");
...但前面提到的模板可以做得更好。
谢谢。那么我可以在上面的例子中使用macro1.function吗? – Steveng 2010-08-30 07:40:13
是的,但这是不好的做法。但有一种情况是使用它,我将它添加到描述中。 – 2010-08-30 07:41:58
然而,你的例子不适用,因为'obj'在'{}'大括号中。 – 2010-08-30 07:50:31
宏在预处理步骤(编译的七个阶段的一部分)中触发文本替换。在运行时返回一个值。这个问题没有意义。
您示例的宏用{obj1}
替换文本macro1
。它只会将文本替换为其他文本;它不知道对象或类的概念。
函数宏在C++函数的意义上并不是真正的函数:它们只是预处理指令。
您的源文件首先被预处理器读取,宏被处理(扩展,替换等),然后将生成的源文件提供给编译器。
因此,宏只不过是在源文件中“复制粘贴”文本。因此,您可以使用包含return
语句的宏,但它只会在您的代码中被替换。
你总能看到什么呢,编译器做,当你定义一个宏(并调用它)的宏.The代码被简单地更换(就像复制粘贴)。
用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
}
你为什么不告诉我们你想要更大的问题解决,而不是一步。 – GManNickG 2010-08-30 07:46:55
@GManNickG也许他只是想知道什么是可能的... – 2014-08-27 08:41:21