包含带静态声明的标头会发生什么?

时间:2016-08-25 08:44:26

标签: c static inline

例如,假设我有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();
}
  1. foo()文件中是否会b.c内联?
  2. foo()(静态)会在main.c文件中显示,因为它通过b.h文件包含在内,或b.c只能看到它吗? (会猜测因为它们不在同一个翻译单元中而无法显示)。

2 个答案:

答案 0 :(得分:3)

foo()bmain中均可见。编译器在预处理器完成其工作后查看文件。

预处理器步骤后

main.c

<all the stuff from stdio.h>
static __inline foo()
{
    // do something
}
void bar();
void main()
{
 bar();
}

foo()移除main.c的一种方法是将a.hb.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()的机器代码。对于非平凡的函数来说可能是浪费的,因为它会导致生成的代码膨胀。因此,只有当它们很小并且打算内联时,你才应该在头文件中定义静态函数。