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

Inv*_*tus 0 c++ header-files

我在堆栈溢出中遇到了一个建议,提到了何时使用以及何时不向用户转发声明.

我遇到了这个: -

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`
Run Code Online (Sandbox Code Playgroud)

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

void f3(X); // Works perfectly fine 
Run Code Online (Sandbox Code Playgroud)

因此,所有头文件(.hh)首先由编译器扫描,然后所有.cc文件寻找语法和语义,我们实际上可以定义
void f3(X);as扫描通过头文件编译器将有关于X的成员函数和成员的想法

Oli*_*rth 5

编译器不扫描头文件.所有发生的事情是#include,在将源文件传递给编译器之前,预处理器会在遇到问题时复制并粘贴头文件的内容.

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

foo.h中

ABC
Run Code Online (Sandbox Code Playgroud)

bar.c

#include "foo.h"
DEF
Run Code Online (Sandbox Code Playgroud)

简单地变成:

ABC
DEF
Run Code Online (Sandbox Code Playgroud)

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