C 语言允许在不向前看的情况下一次性读取源文件;在任何时候,编译器只需要考虑出现在文件当前位置之前的声明、原型、宏定义等。
这是否意味着要内联函数调用,编译器可能需要在调用之前定义函数?例如:
int foo(void);
int bar(void) { return foo(); }
inline int foo(void) { return 42; }
foo
如果将内联定义移到 的定义前面,调用是否更有可能被内联bar
?
我是否应该在我的代码中安排内联定义,以便它们出现在最好内联的调用之前?或者我可以假设任何足够先进的优化编译器都可以进行内联,即使它出现在调用之后(这似乎是 gcc 的情况),也能够找到定义?
编辑:我注意到在带有该/Ob1
选项的 Pelles C 中确实需要定义可见,然后才能内联调用。Compiler 还提供了一个/Ob2
选项来消除此限制(并且还允许编译器在没有 inline 说明符的情况下内联函数,类似于 gcc 所做的),但文档指出使用第二个选项可能需要更多内存。