题
C静态内联函数在运行时是否具有标识?
我应该关心那个构造的命名冲突吗?
如果函数定义在 .c
档案?是一样的吗?
解决方案
C静态内联函数在运行时是否具有标识?
如果编译器至少一次选择不内联静态内联函数,或者如果您获取函数的地址,则静态内联函数在编译单元中具有标识。
取的地址仅在当前编译单元中有效(.c
文件)。在另一个编译单元(another .c
文件),编译器会给你一个不同的地址。
与任何其他具有编译器可见主体的函数一样,来自函数的代码可能会在编译器生成的汇编代码中的不同位置完全或部分复制。
静态内联函数(与任何静态函数一样)从任何其他函数都不可见 .c
比当前编译的文件 .c
档案。
我应该关心那个构造的命名冲突吗?
仅当您获取头文件中定义的静态内联函数的地址并执行以下操作时:
- 静态内联函数
f
在文件中定义a.h
a.h
由C文件包含x.c
和y.c
x.c
以f
并将其存储到全局变量中f_addr
y.c
以f
并将其作为标识与存储在f_addr
- 比较的结果将
false
, ,尽管事实上,在一个 不同的抽象层次 这是完全相同的功能f
如果函数被定义在.c文件?是一样的吗?
从c编译器的角度来看,它与在头文件中定义函数并将头文件包含在头文件中完全相同。c文件。编译器不知道头文件,它只看到一个连续的编译单元。头文件是一个存在于使用C语言的程序员头脑中的概念-这个概念从C编译器的角度来看是不存在的。
其他提示
内联函数的命名与非内联函数的命名同样重要。该名称由 编译器 来标识调用哪个函数。它也被阅读代码的程序员用来理解函数的作用。
在运行时,函数的名称不相关。
另请注意, inline
关键字只是一个 提示 给编译器。该函数可能实际上没有内联,尽管 inline
关键字。同样,未标记为 inline
可能仍然由编译器内联。
你可能不关心内联函数的命名冲突,但我保证编译器会!
内联是编译过程中的后期操作-编译器首先需要确定程序的调用结构,这需要编译器正确解析所有命名调用。
在运行时,如果没有显式编码一些魔术来确定它,您就无法知道任何当前正在执行的函数的名称 - c
不是 反光的.
正如Mark所指出的那样,inline关键字只是一个提示-编译器可以自由地忽略它,如果它决定从显式调用中获得更好的性能。