大家都知道一個C語言寫的程序,需要進行 預編譯->編譯->彙編->鍊接,四個步驟才能生成可執行文件。
今天我們挖掘一下,編譯是以什麼為單位進行的。
所謂的編譯單位,就是說我們在代碼裡寫的#開頭的指令的作用範圍是多大,比如我們在寫.h文件的時候,會在開頭寫上如下的内容:
#ifndef XXXX
#define XXXX
...頭文件内容...
#endif
這些内容是為了防止重複包含,導緻的重複定義錯誤。
那麼#define XXXX,一句的作用範圍是多大呢。 是不是在工程的一個.c文件定義了這個宏定義,其餘的.c文件都不會包含這個頭文件的内容了呢。
下面我們做下實驗。
新建一個Project,添加以下文件到工程。我用的是VC6.0
my_math.h文件:
#ifndef _MY_MATH_H
#define _MY_MATH_H
int add(int a,int b);
#endif
my_math.c文件:
int add(int a,int b)
{
return a b;
}
Test1.c文件:
#include "my_math.h"
void t1()
{
}
Test2.c文件:
include "my_math.h"
void t1()
{
}
main.c:
#include "my_math.h"
void main()
{
int sum = 0;
sum = add(1,2);
}
我在Test1.c、Test2.c、main.c裡都包含了my_math.h。下面我們分别看一下,這三個.c文件,預編譯之後的結果(.c文件預編譯之後,會生成同名的.i文件)。
Test1.i
可以看到裡面有my_math.h的内容。
我們再看下Test2.i
裡面也有my_math.h的内容。
由此可以看到#define _MY_MATH_H,并不是全局的,不是在一個地方定義了,全局都有效。那麼它的有效範圍是多大呢?
下面我們改下Test1.c
#include "my_math.h"
#include "my_math.h"
void t1()
{
}
我故意寫了兩條#include “my_math.h",再看下預編譯之後的結果,是不是包含兩條.h的内容。如下圖:
我們發現,還是隻有一條my_math.h的内容,說明此時#define _MY_MATH_H起作用了。
由此我們得出結論:編譯的基本單元是.c文件。
不知道如何在VC裡查看預編譯結果的,可以在評論區留言。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!