2

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

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

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

4

3 回答 3

2

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

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

另请注意,inline关键字只是对编译器的提示。inline尽管有关键字,该函数实际上可能并未内联。同样,未标记为的函数inline仍可能被编译器内联。

于 2012-03-01T12:18:52.757 回答
1

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

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

在运行时,如果不显式地编写一些魔法来确定它,您将无法知道任何当前正在执行的函数的名称 -c不是反射性的。

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

于 2012-03-01T12:26:01.267 回答
1

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

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

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

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

静态内联函数(与任何静态函数一样).c在当前编译的.c文件之外的任何其他文件中均不可见。

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

仅当您获取头文件中定义的静态内联函数的地址并执行以下操作时:

  1. 静态内联函数f在文件中定义a.h
  2. a.h包含在 C 文件中x.c,并且y.c
  3. x.c获取地址f并将其存储到全局变量中f_addr
  4. y.c获取的地址f并将其与存储的值进行比较f_addr
  5. 比较的结果将是false,尽管在不同的抽象级别上它是完全相同的函数f

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

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

于 2012-03-01T13:21:38.723 回答