class A {
public:
B b;
};
public:
A a;
};
存在类嵌套的问题,编译无法通过。采用前置声明解决
class B;
public:
A a;
class A {
public:
B b;
};
public:
A a;
};
以上代码还是错误的,因为在编译期间对于类的定义需要知道其成员变量类型的大小。将A.b改为指针,因为对于特定的平台指针大小事固定的。
如下是编译四个阶段的过错。其中编译阶段不会去寻找用到的头文件中的函数的定义,只是按照一定规格转换代码格式汇编语言然后通过汇编阶段转化为二进制(.o)。在链接阶段,会在obj文件中查找函数的实现。
在使用GCC进行程序的编译时通常要经历四个阶段(通常指的是从源程序到可执行的二进制代码这整个过程),一些以hello.c为例来说明这四个阶段。
hello.c
#include<stdio.h> int main() { printf("Hello World!\n"); return 0; }
GCC的四个阶段如下:
1.预处理阶段
2.编译阶段
3.汇编阶段
4.链接阶段
四个阶段的详细信息如下:
1.预处理阶段
执行程序:cpp
作用:(1)展开源程序中定义的宏。(2)在源程序中插入include所包含的文件等
执行方法:gcc –E hello.c –o hello.i
执行结果:后缀名为.i的文件,如hello.i
2.编译阶段
执行程序:ccl作用:检查代码的规范性、是否具有语法错误等,并把预处理的文件编译成可读汇编代码。
执行方法:gcc –S hello.i –o hello.s
执行结果:后缀名为.s的文件,如hello.s
3.汇编阶段
执行程序:as作用:把汇编阶段生成.s文件汇编成具体cpu上的目标代码。
执行方法:gcc –c hello.s –o hello.o
执行结果:生成后缀为.o的文件,如hello.o
4.链接阶段
执行程序:ld
作用:把汇编阶段生产的.o文件与相关的目标代码进行链接,生产可执行的二进制文件
执行方法:gcc hello.o –o hello
执行结果:生成可执行的二进制文件,如hello
总结:
阶段 | 程序 | gcc选项 | 输入文件 | 输出文件 |
预处理 | cpp | -E | .c或者其他(hello.c) | .i(hello.i) |
编译 | ccl | -S | .i(hello.i) | .s(hello.s) |
汇编 | as | -c | .s(hello.s) | .o(hello.o) |
链接 | ld | 无 | .o(hello.o) |