#include#include#include#include
#include#define BOOL_TRUE 1 // 定義用到的宏常量與宏函數;
#define BOOL_FALSE 0
#define typename(x) _Generic((x), \
unsigned short: "unsigned short int", \
unsigned long: "unsigned long int", \
default: "unknown")
typedef enum {Host, IP } IP_ADDR_TYPE; // 定義枚舉類型 IP_ADDR_TYPE,用于表示聯合中生效的字段;
typedef struct {// 定義結構 CONN;
size_t id;
uint16_t port;
bool closed;
IP_ADDR_TYPE addr_type;
union { char host_name[256];
char ip[24];
};
} CONN;
inline static const char* findAddr(const CONN* pip) {// 定義函數 findAddr,用于打印 CONN 對象的信息;
assert(pip != NULL); // 運行時斷言,判斷傳入的 CONN 指針是否有效;
return pip->addr_type == Host ? pip->host_name : pip->ip;
}
int main(int argc, char* argv[]) {// 入口函數;
static_assert(sizeof(CONN)<= 0x400, "the size of CONN object exceeds limit."); // 靜態斷言,判斷 CONN 對象的大小是否符合要求;
const CONN conns[] = {// 構造一個數組,包含三個 CONN 對象;
[2] = {1, 80, BOOL_TRUE, IP, {.ip = "127.0.0.1" } },
[0] = {2, 8080, BOOL_FALSE, IP, {.ip = "192.168.1.1" } },
{3, 8088, BOOL_FALSE, Host, {.host_name = "http://localhost/" } }
};
for (size_t i = 0; i< (sizeof(conns) / sizeof(CONN)); ++i) {// 遍歷上述 CONN 數組,并打印其中的內容;
printf(
"Port: %d\n"
"Host/Addr: %s\n"
"Internal type of `id` is: %s\n\n",
conns[i].port,
findAddr(&conns[i]),
typename(conns[i].id)
);
}
return EXIT_SUCCESS;
}
C的編程范式思考C是一種命令式語言,命令式編程(Imperative Programming)是這樣一種編程范式:使用可以改變程序狀態的代碼語句,描述程序應該如何運行。這種方式更關注計算機完成任務所需要執行的具體步驟。
創新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都做網站、成都網站制作、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的蔚縣網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!下面我們來看一個例子。對于“從一個包含有指定數字的集合中,篩選出大于 7 的所有數字”這個需求,按照命令式編程的思路,我們需要通過編程語言來告訴計算機具體的執行步驟。以 C 語言為例,解決這個需求的步驟可能會是這樣:使用數組,構造一塊可以存放這些數字的內存空間;使用循環控制語句,依次檢查內存中的這些數字是否滿足要求(即大于 7);對于滿足要求的數字,將它們拷貝到新的內存空間中,暫存為結果。對應的代碼可能如下所示:
#define ARR_LEN 5
int main(void) { int arr[ARR_LEN] = {1, 5, 10, 9, 0 };
for (int i = 0; i< ARR_LEN; ++i) {if (arr[i] >7) { // save this element somewhere else.
}
}
return 0;
}
相對于命令式編程語言,其他語言一般會被歸類為“聲明式”編程語言。聲明式編程(Declarative Programming)也是一種常見的編程范式。不同的是,這種范式更傾向于表達計算的邏輯,而非解決問題時計算機需要執行的具體步驟。
比如說,還是剛才那個需求,在使用聲明式編程語言時,對應的解決步驟可能是:構建一個容器來存放數據;按照條件對容器數據進行篩選,并將符合條件的數據作為結果返回。如果以 JavaScript 為例,對應的代碼可能如下所示:
let arr = [1, 5, 10, 9, 0]
let result = arr.filter(n =>n >7)
C語言的編譯和運行
C的編譯語法:gcc demo.c -o demo -Wall && ./demo
Wall-讓編譯器明確指出程序中運行的不恰當的地方
編譯器會移除源代碼中所有注釋信息并處理所有宏指令。其中包括進行宏展開、宏替換已經條件編譯等
編譯優化階段編譯器會分析和優化代碼,并將其編譯成對應的匯編格式代碼,這部分代碼中含有使用匯編指令描述的原始C邏輯
匯編階段編譯器會將上面的匯編代碼編譯成具有一定格式可以被操作系統使用的某種對象文件格式
連接階段通過連接處理,編譯器會將所有程序目前需要的對象文件進行整合、設置好程序中所有調用函數的正確地址并生成對應的二進制文件。
編譯結束后即可運行該文件
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
本文題目:C--程序的完整生命周期-創新互聯
網頁路徑:http://vcdvsql.cn/article28/ddhscp.html
成都網站建設公司_創新互聯,為您提供定制網站、網站收錄、域名注冊、小程序開發、微信小程序、做網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯