2010-08-30 70 views
1

宏可以返回一个对象吗?宏返回值

#define macro1 {obj1} 

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

谢谢。

+2

你为什么不告诉我们你想要更大的问题解决,而不是一步。 – GManNickG 2010-08-30 07:46:55

+0

@GManNickG也许他只是想知道什么是可能的... – 2014-08-27 08:41:21

回答

7

宏从不返回任何内容。宏将返回代码的文本表示,该代码将在编译之前被粘贴到程序所在的位置。

阅读关于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"); 

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

+0

谢谢。那么我可以在上面的例子中使用macro1.function吗? – Steveng 2010-08-30 07:40:13

+0

是的,但这是不好的做法。但有一种情况是使用它,我将它添加到描述中。 – 2010-08-30 07:41:58

+0

然而,你的例子不适用,因为'obj'在'{}'大括号中。 – 2010-08-30 07:50:31

6

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

3

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

0

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

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

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

又见Function-like macros

1

你总能看到什么呢,编译器做,当你定义一个宏(并调用它)的宏.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 
}