大程式
一. 多個.c檔案
• main()裡的**太長了適合分成幾個函式
• 乙個源**檔案太長了適合分成幾個⽂檔案
• 兩個獨立的源**檔案不能編譯形成可執行的程式
二.編譯單元
• 乙個.c檔案是乙個編譯單元
• 編譯器每次編譯只處理乙個編譯單元
三.專案
• 在dev c++中新建乙個專案,然後把幾個源**檔案加入進去
• 對於專案,dev c++的編譯會把乙個專案中所有的源**檔案都編譯後,鏈結起來
• 有的ide有分開的編譯和構建兩個按鈕,前者是對單個源**檔案編譯,後者是對整個專案做鏈結標頭檔案
四.函式原型
• 如果不給出函式原型,編譯器會猜測你所呼叫的函式的所有引數都是int,返回型別也是int
• 編譯器在編譯的時候只看當前的乙個編譯單元,它不會去看同乙個專案中的其他編譯單元以找出那個函式的原型
• 如果你的函式並非如此,程式鏈結的時候不會出錯
• 但是執行的時候就不對了
• 所以需要在呼叫函式的地方給出函式的原型,以告訴編譯器那個函式究竟長什麼樣頭⽂檔案
• 把函式原型放到乙個頭⽂檔案(以.h結尾)中,在需要呼叫這個函式的源**檔案(.c檔案)中#include這個標頭檔案,就能讓編譯器在編譯的時候知道函式的原型
五.#include
• #include是乙個編譯預處理指令,和巨集一樣,在編譯之前就處理了
• 它把那個檔案的全部文字內容原封不動地插入到它所在的地方
• 所以也不是一定要在.c檔案的最前面#include
六.「」還是<>
• #include有兩種形式來指出要插入的檔案
• 「」要求編譯器首先在當前目錄(.c⽂檔案所在的目錄)尋找這個檔案,如果沒有,到編譯器指定的目錄去找
• <>讓編譯器只在指定的目錄去找
• 編譯器自己知道自己的標準庫的標頭檔案在**
• 環境變數和編譯器命令列引數也可以指定尋找標頭檔案的目錄
#include #include"main.h
"#include
"min.h"//
int max(int a, int b);
int main(void
)
#include "main.h
"int gall = 12
;int max(int a,int
b)
#ifndef _max_h_ //標頭檔案
#define _max_h_
int max(int a, int
b);extern
int gall; //
宣告全域性變數
struct
node ;
#endif
#include "七.#include的誤區• #include不是用來引入庫的main.h"//
min.h
• stdio.h裡只有printf的原型,printf的**在另外的地方,某個.lib(windows)或.a(unix)中
• 現在的c語言編譯器缺省會引入所有的標準庫
• #include 只是為了讓編譯器知道printf函式的原型,保證你呼叫時給出的引數值是正確的型別
標頭檔案
• 在使用和定義這個函式的地方都應該#include這個標頭檔案
• 一般的做法就是任何.c都有對應的同名的.h,把所有對外公開的函式的原型和全域性變數的宣告都放進去
八.不對外公開的函式
• 在函式前面加上static就使得它成為只能在所在的編譯單元中被使用的函式
• 在全域性變數前面加上static就使得它成為只能在所在的編譯單元中被使用的全域性變數
九.宣告 *
1.變數的宣告
• int i;是變數的定義
• extern int i;是變數的宣告
2.宣告和定義
• 宣告是不產生**的東西
• 函式原型
• 變數宣告
• 結構宣告
• 巨集宣告
• 列舉宣告
• 型別宣告
• inline函式
• 定義是產生**的東西
3.標頭檔案
• 只有宣告可以被放在標頭檔案中
• 是規則不是法律
• 否則會造成乙個專案中多個編譯單元裡有重名的實體
• *某些編譯器允許幾個編譯單元中存在同名的函式,或者用weak修飾符來強調這種存在
4.重複宣告
• 同乙個編譯單元裡,同名的結構不能被重複宣告
• 如果你的標頭檔案裡有結構的宣告,很難這個標頭檔案不會在乙個編譯單元裡被#include多次
• 所以需要「標準標頭檔案結構」
5.標準標頭檔案結構
• 運用條件編譯和巨集,保證這個標頭檔案在乙個編譯單元中只會被#include一次
• #pragma once也能起到相同的作用,但是不是所有的編譯器都支援
6.前向宣告 *
• 因為在這個地方不需要具體知道node是怎樣的,所以可以用struct node來告訴編譯器node是乙個結構
C語言學習一hello world程式
話不多說,直接開始。學習大多數程式語言都是從hello world程式開始的,所以我們也從hello world開始。下面給出程式 1.include 2.3.int main 4.從第一句開始講起吧,c語言共有32個關鍵字,第一行我們就接觸到了我們的第乙個關鍵字include 在中文中的意思是包含...
C語言學習篇(程式類)
用預處理指令 define 宣告乙個常數,用以表明1年中有多少秒 忽略閏年問題 define seconds per year 60 60 24 365 ul註解 1 define 語法的基本知識 例如 不能以分號結束,括號的使用,等等 2 直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是...
C語言學習
c語言學習 2013 3 26 1 編寫strcat s,t 函式,功能 將t指向的字串複製到s指向的字串的尾部。程式設計思路 1 通過while迴圈找到字串s的結束符。2 從找到的結束符開始將t複製到s,同時移動二者的指標。2 編寫函式strend s,t 如果字串t出現在字串s的尾部,該函式返回...