在正向声明的情况下,编译器是如何工作的,Makefile是如何发挥作用的
How does compiler works and Makefile comes to play in case of forward declaration
我在堆栈溢出中遇到了一条建议,其中提到了何时使用和何时不使用用户转发声明。
我偶然发现:-
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
这就是编译器本身的操作。
编译器不扫描头文件。正向声明仅在编译器不需要查看完整定义的情况下有效。这就是为什么它们有时是合法的,有时是非法的。这也是你首先需要它们的原因。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- Makefile在Linux中工作,但在Windows下不起作用,在子目录中找不到文件
- Makefile拒绝工作
- 在我的工作目录中使用 glfw -3.2.1,如何使用 makefile 使用它进行编译
- 在正向声明的情况下,编译器是如何工作的,Makefile是如何发挥作用的
- makefile为不工作的对象文件创建自己的目录
- 对标记在makefile中的工作方式感到困惑
- Makefile opencv停止工作
- Makefile:问题得到ifstatement工作=(