在正向声明的情况下,编译器是如何工作的,Makefile是如何发挥作用的

How does compiler works and Makefile comes to play in case of forward declaration

本文关键字:工作 Makefile 作用 何发挥 何工作 情况下 编译器 声明      更新时间:2023-10-16

我在堆栈溢出中遇到了一条建议,其中提到了何时使用和何时不使用用户转发声明。

我偶然发现:-

struct X;              // Forward declaration of X
void f1(X* px) {}      // Legal: can always use a pointer/reference
X f2(int);             // Legal: return value in function prototype
void f3(X);            // Legal: parameter in function prototype
void f4(X) {}          // ILLEGAL: *definitions* require complete types`

最后一行说非法将在编译时失败。

void f3(X); // Works perfectly fine 

编译器首先扫描所有头文件(.hh),然后扫描所有.cc文件查找语法和符号,我们可以在其中定义
void f3(X);在扫描头文件后编译器会有想法关于X的成员函数和成员

编译器不扫描头文件。只要遇到#include,预处理器就会复制并粘贴头文件的内容,然后将源文件交给编译器。

所以在预处理器运行之后,这个例子是:

foo.h

ABC

bar.c

#include "foo.h"
DEF

简单地变成:

ABC
DEF

这就是编译器本身的操作。

编译器不扫描头文件。正向声明仅在编译器不需要查看完整定义的情况下有效。这就是为什么它们有时是合法的,有时是非法的。这也是你首先需要它们的原因。