tft每日頭條

 > 生活

 > c語言編譯的條件

c語言編譯的條件

生活 更新时间:2025-01-07 11:13:07

大家都知道一個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

c語言編譯的條件(編譯的基本單元是什麼)1

可以看到裡面有my_math.h的内容。

我們再看下Test2.i

c語言編譯的條件(編譯的基本單元是什麼)2

裡面也有my_math.h的内容。

由此可以看到#define _MY_MATH_H,并不是全局的,不是在一個地方定義了,全局都有效。那麼它的有效範圍是多大呢?

下面我們改下Test1.c

#include "my_math.h"

#include "my_math.h"

void t1()

{

}

我故意寫了兩條#include “my_math.h",再看下預編譯之後的結果,是不是包含兩條.h的内容。如下圖:

c語言編譯的條件(編譯的基本單元是什麼)3

我們發現,還是隻有一條my_math.h的内容,說明此時#define _MY_MATH_H起作用了。

由此我們得出結論:編譯的基本單元是.c文件。

不知道如何在VC裡查看預編譯結果的,可以在評論區留言。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved