2010-09-16 76 views
2

可能重复:
Inline functions vs Preprocessor macros内联函数

您好可以有人请解释究竟是什么意思,是什么从正规宏(区别我知道它在编译工作时间,而不是预处理器,但如此?)预先感谢任何帮助,在谷歌看,但没有发现可以理解的东西

+0

你在说什么语言? VBA? – Eric 2010-09-16 13:29:10

回答

1

(假设你在说话关于C/C++。)

内联函数将其代码复制到它所调用的点中,就像宏一样。

您将使用内联函数而不是宏来实现这一目的的主要原因是宏语言比实际的C/C++代码弱得多;编写可理解的,可重用的,没有错误的宏很困​​难。一个宏不会创建一个词法范围,因此一个宏中的变量可能会与已经在其范围内的变量发生冲突。它不会对其参数进行类型检查。引入意想不到的语法错误很容易,因为所有的宏都基本上是搜索和替换。另外,IIRC,编译器可以选择忽略内联指令,如果它认为它真的是骨头的;它不能用宏来完成。或者,为了更方便,简短地说明这一点:宏(在C/C++中,不是说Lisp方言)是非常糟糕的,内联函数让你不使用它们。

另外,请记住,将函数标记为内联通常不是一个好主意。编译器通常会以他们认为合适的方式联机或不联机;通过内联函数标记函数,大多数情况下,您将接管一个低级函数的职责,编译器将比您更了解更多。

1

macrosinline functions之间有很大的区别:

  • 内联只是一个提示编译器 该功能可能会被内联。它 不能保证它会。
  • 编译器可能内嵌函数而不是内联函数 。
  • 宏调用不执行 类型检查,所以宏不是 安全。
  • 使用函数代替宏是 更可能给你一个很好的和 可理解的编译器输出在 的情况下有一些错误。
  • 调试功能比较容易,使用宏的调试功能 复杂了很多调试 。大多数编译器会给你一个 选项来启用或禁用 内联,这是不可能的, 宏。

C++中的一般规则是应尽可能避免使用宏。