• 关于c++源文件与头文件的编译规则总结


    C++语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。

    .cpp文件被称作C++源文件,里面放的都是C++的源代码

    .h文件则被称作C++头文件,里面放的也是C++的源代码,头文件不用被编译

    (1)现在我来实验一下,首先创建一个头文件h1,头文件里定义了两个函数

    1. int f2(int);
    2. int f3(int, int);

    再创建一个源文件y1,声明这两个函数

    1. #include"h1.h"
    2. int f2(int a)
    3. {
    4. //do something here...
    5. return a + a;
    6. }
    7. int f3(int a, int b) {
    8. return a + b;
    9. }

    再创建一个主函数main

    1. #include"h1.h"
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. int number2 = f2(3);
    7. int number3 = f3(1, 2);
    8. cout << "f2:" << "结果如下\n";
    9. cout << number2;
    10. cout << " \n";
    11. cout << "f3:" << "结果如下\n";
    12. cout << number3;
    13. return 0;
    14. }

    结果

     一个符号,在整个程序中可以被声明多次,但却要且仅要被定义一次。

    为了验证,我们创建一个头文件h2,内容和h1一样。

    1. int f2(int);
    2. int f3(int, int);

    编译,此时并没有报错

    再创建一个源文件y2,来定义h2的内容

    1. #include"h2.h"
    2. int f3(int a, int b) {
    3. return a + b;
    4. }
    5. int f2(int a)
    6. {
    7. //do something here...
    8. return a + a;
    9. }

    编译,报错了

    显示重复定义错误

    (2)在头文件声明一个类

    在h2头文件声明一个类A

    1. class A {
    2. public:
    3. A();
    4. A(int , int);
    5. void print();
    6. int f4();
    7. private:
    8. int a;
    9. int b;
    10. };

    在y2源文件中定义这个类

    1. #include"h2.h"
    2. #include
    3. using namespace std;
    4. A::A() {
    5. a = 8;
    6. b = 9;
    7. }
    8. A::A(int n1 , int n2) {
    9. a = n1;
    10. b = n2;
    11. }
    12. void A::print() {
    13. cout << "我是老A\n";
    14. }
    15. int A::f4() {
    16. return a + b;
    17. }

    在main函数中调用

    1. #include"h1.h"
    2. #include"h2.h"
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. int number2 = f2(3);
    8. int number3 = f3(1, 2);
    9. A a;
    10. cout << "f2:" << "结果如下\n";
    11. cout << number2;
    12. cout << " \n";
    13. cout << "f3:" << "结果如下\n";
    14. cout << number3<<"\n";
    15. a.print();
    16. cout << "f4:" << "结果如下\n";
    17. int number4 = a.f4();
    18. cout << number4 << "\n";
    19. return 0;
    20. }

    结果:

    (3)源文件的关联

    创建一个头文件h3

    class A f5();

    再创建一个源文件y3

    1. #include"h2.h"
    2. #include"h3.h"
    3. #include
    4. using namespace std;
    5. A f5() {
    6. A a = A(6, 6);
    7. return a;
    8. }

    在main函数中调用

    1. #include"h1.h"
    2. #include"h2.h"
    3. #include"h3.h"
    4. #include
    5. using namespace std;
    6. int main()
    7. {
    8. int number2 = f2(3);
    9. int number3 = f3(1, 2);
    10. A a;
    11. cout << "f2:" << "结果如下\n";
    12. cout << number2;
    13. cout << " \n";
    14. cout << "f3:" << "结果如下\n";
    15. cout << number3<<"\n";
    16. a.print();
    17. cout << "f4:" << "结果如下\n";
    18. int number4 = a.f4();
    19. cout << number4 << "\n";
    20. A b = f5();
    21. b.print();
    22. int number5 = b.f4();
    23. cout << "f5:" << "结果如下\n";
    24. cout << number5 << "\n";
    25. return 0;
    26. }

    结果:

  • 相关阅读:
    计算机毕业设计(附源码)python圆梦酒店管理系统
    docker报错standard init linux.go:228 exec user process caused: exec format error
    Spring——AOP(Aspect Oriented Programming)
    Meta的画质让我震惊
    u盘被格式化了文件还可以恢复吗?
    “京台高铁”亮相百度地图,真能在2035年建成吗?
    使用Redis实现缓存及对应问题解决
    代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素 I
    10月11日,每日信息差
    1 奥运排行榜 (30分)
  • 原文地址:https://blog.csdn.net/zhang2362167998/article/details/126441873