我在堆栈溢出中遇到了一个建议,提到了何时使用以及何时不向用户转发声明.
我遇到了这个: -
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的成员函数和成员的想法
编译器不扫描头文件.所有发生的事情是#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)
这就是编译器本身的操作.
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |