我正在尝试研究inline
的复杂性。为此,我创建了这个小程序。我定义了一个内联函数,该函数具有与全局定义的变量同名的“自动”变量。确保我的功能标记为static
(以满足C99标准)之后,我正在研究使用objdump创建的可执行文件。但是首先,这是我的程序
#include <stdio.h>
#include <stdlib.h>
int AAAABBBB = 5; //global scope
#define DOINLINE$
#ifdef DOINLINE
static inline void __attribute__((always_inline)) myfunc() {
#else
void myfunc() {
#endif
static int AAAABBBB = 6;
printf("global is now %d\n", AAAABBBB);
}
int main() {
printf("global is %d\n", AAAABBBB);
myfunc();
printf("global is now %d\n", AAAABBBB);
return 0;
}
此功能按预期工作,并且在这些看似冲突的名称之间没有任何冲突。但是,查看可执行文件(以及目标文件)的对象转储,我看到编译器确实满足了我的请求,并且myfunc
没有单独的部分。这是objdump的粘贴。我确定myfunc
内部的局部变量埋在其中,但是似乎无法弄清楚它在哪里。任何人都可以通过一些指向它的指针来提示一下?注意:将函数局部变量声明为非静态似乎根本没有影响。希望能提供一些有见地的答案
我正在尝试研究内联的复杂性。为此,我创建了这个小程序。我定义了一个内联函数,该函数具有与全局定义的同名的“自动”变量...
AAAABBBB
中定义的myfunc
不会出现在目标文件中,因为编译器已对其进行了优化。我们可以在main
的反汇编中看到这一点,这里是内联myfunc
的代码: