C語言中如何實(shí)現(xiàn)多文件編程

????眾所周知源代碼是通過 預(yù)編譯、編譯、匯編、鏈接、?最后生成的可執(zhí)行文件的↓

但是在很多時(shí)候初學(xué)者會(huì)在不知情的情況下直接忽略了鏈接這一實(shí)質(zhì)性的過程,畢竟大多數(shù)的初學(xué)者都是優(yōu)先選擇IDE(集成開發(fā)環(huán)境)。
所以這一期專欄讓我們用C語言的角度來進(jìn)行多文件的鏈接(調(diào)用)吧!

首先看一下這段代碼清單↓
main函數(shù)部分
這是一段非常簡(jiǎn)單的調(diào)用函數(shù)的小例子;即便把這些代碼寫的再?gòu)?fù)雜,它也只局限于這一單個(gè)文件中。
那么應(yīng)該如何突破單個(gè)文件的局限呢?
首先介紹 extern關(guān)鍵字;有它當(dāng)做“向?qū)А备嬖V編譯器其他文件的位置就可以解決多文件調(diào)用的問題了。
其次看一下這塊代碼↓
當(dāng)然這塊代碼的用法還有很多,這里只舉例了一種配合extern關(guān)鍵字的使用方法。
(文章結(jié)尾還會(huì)更多的介紹一下 #ifdnef #endif的)

有了#define 的支持以及 extern的指向就可以實(shí)現(xiàn)多文件的簡(jiǎn)單鏈接調(diào)用了↓
下面寫一個(gè)簡(jiǎn)易的凱撒密碼環(huán)的加密程序來做一個(gè)多文件調(diào)用的實(shí)驗(yàn)↓
庫頭文件部分
鏈接頭文件部分
CaesarFunction函數(shù)部分
main函數(shù)部分
嫌麻煩的同學(xué)可以把調(diào)用文件換成 HelloWorld (doge?↑
?寫好頭文件?就可以直接在main方法中直接調(diào)用咱們寫好的程序文件了。
后記-?#ifndef #endif?與 #pragma?once?的區(qū)別
為了避免同一個(gè)頭文件被包含(include)多次,C/C++中有兩種宏實(shí)現(xiàn)方式:
一種是#ifndef #endif 方式;另一種是#pragma once方式。
在能夠支持這兩種方式的編譯器上,二者并沒有太大的區(qū)別。但兩者仍然有一些細(xì)微的區(qū)別。

#ifndef
#ifndef的方式受C/C++語言標(biāo)準(zhǔn)支持。它不僅可以保證同一個(gè)文件不會(huì)被包含多次,也能保證內(nèi)容完全相同的兩個(gè)文件(或者代碼片段)不會(huì)被不小心同時(shí)包含。
當(dāng)然,缺點(diǎn)就是如果不同頭文件中的宏名不小心“撞車” 可能就會(huì)導(dǎo)致你看到頭文件明明存在,但編譯器卻硬說找不到聲明的狀況——這種情況有時(shí)非常讓人郁悶。
由于編譯器每次都需要打開頭文件才能判定是否有重復(fù)定義,因此在編譯大型項(xiàng)目時(shí),ifndef會(huì)使得編譯時(shí)間相對(duì)較長(zhǎng),因此一些編譯器逐漸開始支持#pragma once的方式。
#pragma once
#pragma once 一般由編譯器提供保證:同一個(gè)文件不會(huì)被包含多次。注意這里所說的“同一個(gè)文件”是指物理上的一個(gè)文件,而不是指內(nèi)容相同的兩個(gè)文件。
你無法對(duì)一個(gè)頭文件中的一段代碼作pragma once聲明,而只能針對(duì)文件。
其好處是,你不必再擔(dān)心宏名沖突了,當(dāng)然也就不會(huì)出現(xiàn)宏名沖突引發(fā)的奇怪問題。大型項(xiàng)目的編譯速度也因此提高了一些。
對(duì)應(yīng)的缺點(diǎn)就是如果某個(gè)頭文件有多份拷貝,本方法不能保證他們不被重復(fù)包含。當(dāng)然,相比宏名沖突引發(fā)的“找不到聲明”的問題,這種重復(fù)包含很容易被發(fā)現(xiàn)并修正。
另外,這種方式不支持跨平臺(tái)!
#pragma once 方式產(chǎn)生于#ifndef之后,因此很多人可能甚至沒有聽說過。目前看來#ifndef更受到推崇。因?yàn)?ifndef受C/C++語言標(biāo)準(zhǔn)的支持,不受編譯器的任何限制;而#pragma once方式卻不受一些較老版本的編譯器支持,一些支持了的編譯器又打算去掉它,所以它的兼容性可能不夠好。
后記原鏈接:https://blog.csdn.net/fanyun_01/article/details/77413992