c語言多檔案編譯

騎著程式碼去流浪發表於2018-05-15

假設現在有三個c原始檔:

max.c:

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

min.c:

int min(int a,int b)
{
	if(a < b){
		return a;
	}else{
		return b;
	}
}

res.c:

#include <stdio.h>

int main()
{
    int a = 99;
    int b = 88;
    int maxVal = max(a,b);
    int minVal = min(a,b);
    printf("the max value is %d\nthe min value is %d\n",maxVal,minVal);
    return 0;
}

1.引入原始檔的方式進行編譯

這種編譯方式是在main函式的檔案中引入其他檔案進行編譯:

res.c:

#include <stdio.h>
#include "max.c"
#include "min.c"

int main()
{
    int a = 99;
    int b = 88;
    int maxVal = max(a,b);
    int minVal = min(a,b);
    printf("the max value is %d\nthe min value is %d\n",maxVal,minVal);
    return 0;
}

優點是不需要對原始檔進行編譯而直接在main檔案中引入即可,且原始檔的程式碼可以看到;

缺點是每次都要對所有的原始檔進行重新編譯,比較耗時;

2.引入頭部檔案的方式進行編譯

如果在開發專案的時候,max.c和min.c是已經寫好的不必修改的檔案,那麼可以直接用gcc -c命令這兩個檔案編譯成.o二進位制檔案,然後在gcc編譯的四個階段的最後階段連結到res.c檔案中即可。


但是如果這兩個檔案是其他同事開發的,而這邊拿到的只是max.o和min.o二進位制檔案,需要檢視函式的型別和傳參的時候是難以分析二進位制檔案的,所以可以將這個兩個二進位制檔案中的函式宣告在一個.h的標頭檔案中,方便開發者使用(如果main函式中的printf的函式在stdio.h標頭檔案中宣告一樣)。

cal.h:

int max(int a,int b); 
int min(int a,int b);

res.c:

#include <stdio.h>
#include "cal.h"

int main()
{
    int a = 99;
    int b = 88;
    int maxVal = max(a,b);
    int minVal = min(a,b);
    printf("the max value is %d\nthe min value is %d\n",maxVal,minVal);
    return 0;
}

再次編譯:



相關文章