2012-03-01 68 views
2

C静态内联函数在运行时是否具有标识?静态内联函数的标识?

我应该关心该构造的命名冲突吗?

如果函数定义在.c文件中?它是一样的吗?

回答

1

C静态内联函数在运行时是否具有身份?

如果编译器至少选择一次不内联它,或者如果您取得该函数的地址,则静态内联函数在编译单元中具有标识。

取得的地址仅在当前编译单元(.c文件)中有效。在另一个编译单元(另一个.c文件)中,编译器会给你一个不同的地址。

与编译器可见的任何其他函数一样,函数中的代码可能完全或部分复制到由编译器生成的汇编代码中的各个位置。

从当前编译的.c文件中看不到任何其他.c文件中的静态内联函数(与任何静态函数一样)。

我应该关心该构造的命名冲突吗?

只有当你需要在头文件中定义的静态内联函数的地址,并执行以下操作:

  1. 静态内联函数f在文件a.h
  2. a.h定义为C包括文件x.cy.c
  3. x.c需要的f并将其存储在地址转换成全局变量f_addr
  4. y.c需要的f的地址和用于身份,进行比较,以存储在f_addr
  5. 所述比较将所述false的结果值尽管事实上在不同的抽象级别它是非常相同的功能f

如果函数是在.c文件中定义的?它是一样的吗?

从C编译器的角度来看,它与在头文件中定义函数和在.c文件中包含头文件完全相同。编译器不知道头文件,它只看到一个连续的编译单元。头文件是使用C语言的程序员脑海中存在的概念 - 从C编译器的角度来看,这个概念并不存在。

+0

最后一个问题的答案真的很好,谢谢! – Eonil 2012-03-01 15:15:15

2

内联函数的命名与非内联函数的命名一样重要。该名称由编译器用于标识要调用的函数。程序员通过阅读代码也可以使用它来理解函数的作用。

在运行时,函数的名称不相关。

还要注意的是inline关键字只有提示编译器。尽管有inline关键字,该函数实际上可能不会内联。同样,未标记为inline的函数可能仍由编译器内联。

1

您可能不在意命名内联函数的冲突,但我保证编译器会!

内联是编译期间的后期操作 - 编译器首先需要确定程序的调用结构,这需要编译器正确解析所有已命名的调用。

在运行时,你可以不知道任何当前正在执行的函数的名称不明确编码某种魔力,以确定它 - c反射

正如Mark指出的那样,inline关键字只是一个提示 - 如果编译器决定从显式调用获得更好的性能,编译器可以自由忽略它。