例如,假设我有2个头文件。
A.H
#include <stdio.h>
static __inline foo()
{
// do something
}
然后a.h
文件被包含在b.h
中:
b.h
#include "a.h"
void bar();
使用相应的b.cpp
文件:
b.c
#include "b.h"
void bar()
{
foo();
}
的main.c
#include "b.h"
void main()
{
bar();
}
foo()
文件中是否会b.c
内联? foo()
(静态)会在main.c
文件中显示,因为它通过b.h
文件包含在内,或b.c
只能看到它吗? (会猜测因为它们不在同一个翻译单元中而无法显示)。答案 0 :(得分:3)
foo()
在b
和main
中均可见。编译器在预处理器完成其工作后查看文件。
main.c
:
<all the stuff from stdio.h>
static __inline foo()
{
// do something
}
void bar();
void main()
{
bar();
}
从foo()
移除main.c
的一种方法是将a.h
从b.h
移至b.c
:
修改后的b.h
:
void bar();
修改后的b.c
:
#include "a.h"
#include "b.h"
void bar()
{
foo();
}
答案 1 :(得分:0)
foo()
文件中是否会b.c
内联?
最好说&#34;内联&#34;进入功能bar()
。可能是,但不能保证。编译器决定是否内联函数。将函数标记为内联通常只是一个提示,可以忽略。请参阅编译器文档以阐明实际行为。
foo()
(静态)会在main.c
文件中显示,因为它是{ 包含在b.h
文件中,或b.c
只能看到它? (会猜 由于它们不在同一个翻译单元中,所以它不会被看到。)
foo()
在每个直接或间接包含a.h
的翻译单元中都可见。假设内联被省略,还有另一个有趣的观点:每个翻译单元定义自己的foo()
副本,即为每个编译的源生成foo()
的机器代码。对于非平凡的函数来说可能是浪费的,因为它会导致生成的代码膨胀。因此,只有当它们很小并且打算内联时,你才应该在头文件中定义静态函数。