• C语言多个源文件编译


    多源文件编译:

    新建一个 main.c

     

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){    
        int i = myMax(20,40);
        printf("i = %d",i);
        system("pause");
        return 0;
    }

     

    然后再创建一个 a.c

     

    int myMax(int a,int b) {
        if(a>b)
            return a;
        return b;
    }

     

    然后编译

    如果不是 visual studio C++ 的环境的话,会报错的。所以我用了dev C++就报了错。

    错误信息:

    8 21 F:c++codeInDev多源文件编译main.c [Error] 'myMax' was not declared in this scope

    说 myMax 没这个函数。

     

    所以 需要一个 函数的声明。

    main.c 代码:

     

    #include <stdio.h>
    #include <stdlib.h>
    
    int myMax(int a,int b);
    
    int main(){
        
        int i = myMax(20,40);
        printf("i = %d",i);
        system("pause");
        return 0;
        
    }

     

    第二种写法——采用加载头文件的方式:

    main.c 代码:

     

    #include <iostream>
    #include "a.h"
    int main() {
        printf("较大的数字是:%d
    ",myMax(20,30));
        return 0;
    }

     

    a.h代码:

     

    int myMax(int a,int b);

    a.c 代码:

     

    int myMax(int a,int b){
        if(a>b)
            return a;
        return b;
    }

     

    扩展:

    main.c代码

     

    #include <iostream>
    #include "a.h" 
    #include "b.h"
    int main() {
        printf("较大的数字是:%d
    ",myMax(20,40));
        printf("两数之和是:%d
    ",myAdd(20,50));
        return 0;
    }

     

    a.c代码:

     

    int myMax(int a,int b){
        if(a>b)
        return a;
        return b;
    }

     

    a.h 代码:

     

    int myMax(int a,int b){
        if(a>b)
        return a;
        return b;
    }

     

    b.h 代码:

     

    int myAdd(int a, int b);

     

    b.c 代码:

    int myAdd(int a, int b){
        return a+b;
    }

    运行结果示例:

    马上要引出一个 别的事儿:

    dev竟然不可以复制文件夹,估计有什么隐含设置。。。在 android里面 和 javaweb里面都有这么一个东西的。android太久不弄有点儿忘记了,在 javaweb里面,选中一个项目,摁住alt+Enter,然后 搜索 web。然后再修改这个 项目的名称,否则当前复制的项目会覆盖之前的那个项目。在发布之后】

    那就在 这个 上面改吧。。。

     

    如果 b.h 里面包含了 a.h 那么会出现什么样的状况呢?

    修改后的b.h:

     

    #include "a.h"
    int myAdd(int a, int b);

     

    好吧,竟然没有问题。

    但是 理论上这样多包含了一个 int myMax(int a,int b);就相当于重复的声明在main.c了照理说是不可以的。

    所以诞生了 #ifndef #define #endif

    所以把程序 写成这样:

     

    好吧 就是 想引入这个 如果 没有定义的话,就定义 这样一个 概念。

    示例代码://我们可以学着照抄人家的代码,人家的这种.h 文件基本上都是这样做的。完后看基本上都是 #endif 结尾的

     

    修改的部分:

     

    a.h 代码:

     

    #ifndef _AH
    #define _AH
    int myMax(int a,int b);
    #endif

     

    b.h 代码:

     

    #ifndef _BH
    #define _BH
    int myAdd(int a, int b);
    #endif

     

    这是 原来本身c语言里面提供的类库文件的书写格式,下面截了个图

    可以看到人家也是这么操作的。

    相关描述:

    extern c++特有的!声明这段东西要以,C的方式编译。用在 dll的书写上,dll这个 东西真的是很神奇。是动态加载的类库文件。这种动态加载是在程序运行的时候,把当前这个 exe文件和exe所需要的dll文件一起在内存中开辟一块空间。所以这样就导致exe做出来可以很小。但是对于静态的lib来说。需要一起打包在exe文件中,这样exe就很大。并且每次改动都需要重新编译exe文件。但是对于dll的话,只需要重新编译这一部分,然后把dll放到对应目录下面,就可以了。并且,通常情况下,高级语言开发上层,逻辑部分很迅速。但是用c就很乏力,但是对于某些必须要操作硬件的部分就只能使用C开发好dll,然后可以让java等上层语言进行调用。这样的语言除了java还有 C++python等等.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    PAT甲级1114. Family Property
    PAT甲级1111. Online Map
    Android零基础入门第84节:引入Fragment原来是这么回事
    Android零基础入门第83节:Activity间数据传递方法汇总
    Android零基础入门第82节:Activity数据回传
    Android零基础入门第81节:Activity数据传递
    Android零基础入门第80节:Intent 属性详解(下)
    Android零基础入门第79节:Intent 属性详解(上)
    Android零基础入门第78节:四大组件的纽带——Intent
    Android零基础入门第77节:Activity任务栈和启动模式
  • 原文地址:https://www.cnblogs.com/letben/p/5219280.html
Copyright © 2020-2023  润新知