如果你不打算重新編譯包含的文件,是否有任何理由更喜歡使用包含指令的鏈接器命令如果?'#include'file2.c''與'gcc file1.c file2.c'有什麼不同?
P.S.如果它很重要,我實際上關心的是C++和g ++,但我認爲gcc作爲一個通用編譯器會更容易識別。
如果你不打算重新編譯包含的文件,是否有任何理由更喜歡使用包含指令的鏈接器命令如果?'#include'file2.c''與'gcc file1.c file2.c'有什麼不同?
P.S.如果它很重要,我實際上關心的是C++和g ++,但我認爲gcc作爲一個通用編譯器會更容易識別。
是否有任何理由,更喜歡命令連接在包括指令
是。如果在這裏和那裏包含實現(.c
)文件,則會遇到嚴重問題。滿足連接錯誤臭名昭著的「符號_Myfunc的多重定義」 ...
(順便說一下,它也被認爲是不好的風格/做法,一般來說,只有頭文件是爲了被包括在內。)
如果你真的只想要一個長的C文件,用你的編輯器將file2.c插入到file1.c中,然後刪除file2.c。如果他們總是走在一起,那麼(可能)是正確的解決方案。使用#include這不是正確的解決方案。
我們將文件拆分爲單獨的.c和.cpp文件的原因在於,它們在邏輯上獨立於代碼的其餘部分。當程序很大時,分別編譯每個單元是一個好主意,但將事物分解成單獨文件的主要原因是顯示每個單元代碼的獨立性。通過這種方式,您可以查看其他部分對此特定文件的影響(查看包含的標題)。如果一個類對於.cpp文件是本地的,那麼您知道該類不會被用在系統中的其他地方,所以您可以安全地更改該類的內部,而不必擔心其他組件會受到影響。另一方面,如果一切都在一個大文件中,那麼很難跟蹤影響什麼的因素,什麼是可以改變的。
以下是區別。 file1.c
:
#include <stdio.h>
static int foo = 37;
int main() { printf("%d\n", foo); }
file2.c
:
static int foo = 42;
這兩個平凡的模塊編譯罰款與gcc file1.c file2.c
,即使再從未使用過的foo
file2.c
的定義。 static
標識符僅在翻譯單元(C的更通常稱爲模塊的版本)內可見。
當你#include "file2.c"
在file1.c
,您可以有效地插入到file2.c
file1.c
,引起標識符衝突前的兩個文件現在已經成爲一個翻譯單元。
通常,從來沒有#include
C或C++源文件。只有#include
標題。
另外,#include使它成爲相同的翻譯單元。 –
@CoryNelson是的,這會導致更多的混淆,例如,如果您有兩個相同名稱的靜態函數... – 2012-12-29 07:50:52