您好,登錄后才能下訂單哦!
這篇文章主要介紹“c語言內外部函數與編譯預處理的方法”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“c語言內外部函數與編譯預處理的方法”文章能幫助大家解決問題。
內部函數與外部函數
C語言程序的基本構成單位是函數,多源程序文件構成的程序中,函數的定義和調用也必須考慮可以調用的程序范圍問題。
函數本質是全局的,定義函數的目的就是被其他函數調用。如果不回聲明的話,一個源程序文件中定義的函數既可以被本文件中的其它函數被調用,也可以被其它源程序文件中的函數調用。根據函數能否被其他源程序文件調用,可以把函數分為內部函數和外部函數。
1. 內部函數
如果一個函數只能被其所在的源程序文件中其它的函數調用,則稱為內部函數。定義內部函數時,在函數頭的前面加上static關鍵字
static 類型標識符 函數名(形式參數列表)
{
}
2. 外部函數
如果在定義函數時,在函數頭的前面使用extern關鍵字進行說明,則函數為外部函數。可以供其他源程序文件中的函數調用,一般形式如下:
extern 類型標識符 函數名(形式參數列表)
{
}
例如:
extern void process(int a, int b)
{
……
}
C語言規定,如果在定義函數時沒用使用static或extern關鍵字說明,則函數默認為外部函數,即相對于使用了extern說明。
在需要調用外部函數的其它源程序文件中,需要對被調用的函數進行使用extern關鍵字進行原型說明。例如:extern void process(int a,int b);
編譯預處理
C語言的編譯預處理命令主要包括:宏定義、文件包含和條件編譯。預處理命令均以“#”開始,命令的結尾沒有分號,每條預處理命令必須占用單獨一行。
1.宏定義
(1) 無參宏定義
無參宏定義的一般形式如下:
#define 宏名 字符序列
如果源程序中使用了宏定義,編譯預處理過程中,自動把源程序中出現的所有“宏名”替換為“字符序列”,這是一個純文本替換,也稱為宏替換。
例如下面定義了3個無參宏名:
#define PI 3.14
#define R 10
#define AREA PI*R*R
(2) 有參宏定義
有參宏定義的一般形式如下:
#define 宏名(參數表) 字符序列
有參宏定義在進行宏替換時,源程序出現宏名的地方都使用字符序列替換,替換時使用宏引用中的實參去替換宏定義中的形參。
例如,如下定義了一個有參的宏名。
#define MUL(a,b) (a)*(b)
源程序中可以使用如下語句使用有參的宏:
int x=3, y=4, z;
z=MUL(x,y);
注意:通常需要在有參宏定義時,字符序列中參數要加上圓括號,以免進行宏替換時出現錯誤,如z=MUL(x+3,y-1)*10,進行宏替換后的語句為:z=x+3*y-1*10;。
(3) 文件包含
文件包含也是一種編譯預處理命令,其作用是把被包含的文件的內容全部引入到使用文件包含命令的源程序文件中。文件包含命令有以下2種形式:
#include <文件名> 或 #include "文件名"
文件包含命令使用尖括號形式時,編譯器在系統默認的路徑中尋找被包含文件;使用雙引用形式時,編譯器先在用戶程序的當前工作目錄中尋找被包含文件,如果找不到文件,再去系統默認的路徑中尋找文件。
下面是幾個文件包含命令的例子:
#include <stdio.h> //包含系統預定義的頭文件
#include "user.h" //包含自定義的頭文件
#include "func.c" //包含自定義的源程序文件
(4)條件編譯
通常情況下,源程序文件中的所有語句行都需要參與編譯,并生成到目標文件中。如果源程序需要根據特定的條件決定一部分源代碼是否參加編譯,則需要使用條件編譯預處理命令。
C語言的條件編譯預處理指令主要有三種形式。
1、#if指令
一般形式:
#if 表達式
程序段1
#else
程序段2
#endif
2、#ifdef指令
一般形式:
#ifdef 宏名
程序段1
#else
程序段2
#endif
3、#ifndef指令
一般形式:
#ifndef 宏名
程序段1
#else
程序段2
#endif
關于“c語言內外部函數與編譯預處理的方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。