C static inline函数在运行时是否具有标识?
我是否应该关注该构造的命名冲突?
如果在.c
文件中定义了该功能?它是一样的吗?
答案 0 :(得分:2)
内联函数的命名与非内联函数的命名同样重要。 编译器使用该名称来标识要调用的函数。程序员也可以使用它来阅读代码,以了解函数的作用。
在运行时,该函数的名称不相关。
另请注意,inline
关键字只是编译器的提示。尽管有inline
关键字,但实际上可能无法内联该函数。同样,编译器仍可能会内联未标记为inline
的函数。
答案 1 :(得分:1)
您可能不关心内联函数的命名冲突,但我保证编译器会!
内联是编译期间的后期操作 - 编译器首先需要确定程序的调用结构,这需要编译器正确解析所有命名调用。
在运行时,您无法知道任何当前正在执行的函数的名称,如果没有明确编写某些魔法来确定它 - c
不是反射。
正如Mark指出的那样,inline关键字只是一个提示 - 如果编译器决定从显式调用获得更好的性能,编译器可以自由地忽略它。
答案 2 :(得分:1)
C static inline函数在运行时是否具有标识?
静态内联函数在编译单元中具有标识,如果编译器至少一次选择不内联它,或者如果你获取函数的地址。
获取的地址仅在当前编译单元(.c
文件)中有效。在另一个编译单元(另一个.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编译器的角度来看,这个概念不存在。