宏可以返回一个对象吗?
#define macro1 {obj1}
由于宏是文本替换,我可以使用宏像macro1.function1()?
感谢。
答案 0 :(得分:8)
宏永远不会返回任何内容。宏返回代码的文本表示,该代码将被粘贴到编译之前使用它的程序的位置。
所以:
#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
语句的宏,但它只会在您的代码中被替换。