c語言程序環境和預處理

test.c(源文件) --> 編譯器 --> test.obj(目標文件,在debug里)
鏈接庫和多個目標文件 經過 鏈接器的處理,最終生成可執行程序.exe

編譯階段

預處理/預編譯階段 :1.頭文件的包含 2.define定義符號的替換,并刪除定義的符號 3.刪除注釋 這三個都是文本操作
編譯:把C語言代碼轉換成匯編代碼
匯編:把匯編代碼轉換成二進制指令,形成符號表

鏈接階段

合并段表
符號表的合并和重定位

預處理

__ FILE__進行編譯源文件的位置
__ LINE__文件當前的行號
__ DATE__文件被編譯的日期
__ TIME__文件被編譯的時間
在這里插入圖片描述

__ STDC__判斷編譯器是否服從標準C(ANSI C)數值就是1,否則就是沒有定義這個內置符號
可以看出vs不遵循此標準
在這里插入圖片描述
大多數oj網站使用gcc或者clang編譯器

define定義標識符

后面加上“;”是一種非常坑爹的行為
#define MAX 1000
#define STR “hello world”

#define定義宏

對于宏不能遞歸

#define SQUARE(x) x*x
int main()
{int r = SQUARE(5);printf("%d ", r);  //25return 0;
}

為了避免以下情況發生

#define SQUARE(x) x*x
int main()
{int r = SQUARE(5+1);// r = 5 + 1*5 + 1 printf("%d ", r);  //11return 0;
}

可以define成

#define SQUARE(x) ((x)*(x))

#define PRINT(N,FORMAT) printf("the value of " #N " is "FORMAT"\n",N)  //#會把參數對應的轉換成字符串
int main()
{int  a = 10;PRINT(a,"%d");  //the value of a is 10double b = 3.14;PRINT(b, "%lf");  //the value of b is 3.140000return 0;
}

// ##可以把位于它兩邊的符號合成一個符號#define CAT(Class,Num) Class##Num
int main()
{int class106 = 100;printf("%d", CAT(class, 106)); //100return 0;
}
#define M 100
int main()
{int a = M;
#undef Mreturn 0;
}

//offsetof宏模擬實現
struct s
{char c1;int i;char c2;
};#define OFFSETOF(type,m_name)  (size_t)&(((type*)0)->m_name)
int main()
{struct s s = { 0 };printf("%d\n", offsetof(struct s, c1)); //0printf("%d\n", offsetof(struct s, i));  //4printf("%d\n", offsetof(struct s, c2)); //8printf("%d\n", OFFSETOF(struct s, c1)); //0printf("%d\n", OFFSETOF(struct s, i));  //4printf("%d\n", OFFSETOF(struct s, c2)); //8return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46334.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46334.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

醫學影像歸檔與通訊系統源碼,C#PACS源碼,涵蓋放射、超聲、內鏡、病理、核醫學

醫學影像歸檔與通訊系統(PACS)系統,是一套適用于從單一影像設備到放射科室、到全院級別等各種應用規模的醫學影像歸檔與通訊系統。PACS集患者登記、圖像采集、存檔與調閱、報告與打印、查詢、統計、刻錄等功能為一體,有效地實現了…

【保衛花果山】游戲

游戲介紹 拯救花果山是一款玩家能夠進行趣味闖關的休閑類游戲。拯救花果山中玩家需要保護花果山的猴子,利用各種道具來防御妖魔鬼怪的入侵,游戲中玩家需要面對的場景非常的多樣,要找到各種應對敵人的方法。拯救花果山里玩家可以不斷的進行闖…

【開源 Mac 工具推薦之 2】洛雪音樂(lx-music-desktop):免費良心的音樂平臺

舊版文章:【macOS免費軟件推薦】第6期:洛雪音樂 Note:本文在舊版文章的基礎上,新更新展示了一些洛雪音樂的新功能,并且描述更為詳細。 簡介 洛雪音樂(GitHub 名:lx-music-desktop )…

JavaScript學習筆記(九)

56、JavaScript 類 56.1 JavaScript 類的語法 請使用關鍵字 class 創建一個類。 請始終添加一個名為 constructor() 的方法。 JavaScript 類不是對象。 它是 JavaScript 對象的模板。 語法: class ClassName {constructor() { ... } }示例:例子創…

C#實現數據采集系統-ModbusTCP查詢報文分析和實現、通信實現、測試項目

ModbusTcp的應用 Modbus是工業通信協議中廣泛使用的協議,大部分設備都支持。Modbus TCP是一種基于TCP/IP網絡的工業通信協議,它是Modbus協議的一種變種,專門設計用于在網絡上傳輸數據。 Modbus TCP/IP保留了Modbus串行協議的數據結構和功能特性,同時利用了TCP/IP網絡的高…

什么是 std::ios::sync_with_stdio(false)

介紹 std::ios::sync_with_stdio(false) 是 C 中的一個配置設置,用于控制標準 I/O 流(如 std::cin, std::cout)的行為。這個設置主要用于優化輸入輸出操作的性能,尤其是在處理大量數據時。 在 C 中,標準流庫&#xf…

stm32:CAN通訊

目錄 介紹 協議層 CAN的 幀/報文 種類 數據幀 遠程幀(遙控幀) 錯誤幀 過載幀 幀間隔 總線仲裁 stm32的CAN外設 工作模式 測試模式 功能框圖 時序 標準時序 例子 環回靜默模式測試 寄存器代碼 HAL版本 介紹 一種功能豐富的車用總線標…

分布式存儲概述

1. 分布式存儲概念 大規模分布式存儲系統的定義如下: “分布式存儲系統是大量普通PC服務器通過Internet互聯,對外作為一個整體提供存儲服務。” 分布式存儲系統具有如下幾個特性: 可擴展。分布式存儲系統可以擴展到幾百臺甚至幾千臺的集群規模,而且&a…

24暑假算法刷題 | Day15 | LeetCode 110. 平衡二叉樹,257. 二叉樹的所有路徑,404. 左葉子之和,222. 完全二叉樹的節點個數

目錄 110. 平衡二叉樹題目描述題解 257. 二叉樹的所有路徑題目描述題解 404. 左葉子之和題目描述題解 222. 完全二叉樹的節點個數題目描述題解 110. 平衡二叉樹 點此跳轉題目鏈接 題目描述 給定一個二叉樹,判斷它是否是平衡二叉樹 平衡二叉樹 是指該樹所有節點的…

Redis-布隆過濾器(Bloom Filter)詳解

文章目錄 什么是布隆過濾器 布隆過濾器的優點:布隆過濾器的缺點:其他問題 布隆過濾器適合的場景布隆過濾器原理 數據結構增加元素查詢元素刪除元素 如何使用布隆過濾器 Google開源的Guava自帶布隆過濾器Redis實現布隆過濾器 Redis中配置布隆過濾器Redis…

【echarts】tooltip 增加單位

單個柱子 const data [{value: 1,per: 2},{value: 22,per: 2},{value: 222,per: 3} ];tooltip: {trigger: axis,show: true,axisPointer: {type: line,lineStyle: {color: rgba(0, 0, 0, 0.03),type: solid,width: 60,},},formatter(params) {return ${params[0].name}: ${par…

歐鵬 數據庫第一次作業

第一次作業題目 1,windows中選擇一種方式安裝mysql 2,新建產品庫(名字自擬)db_mysql_3 3,使用產品庫新建三張表 如下: 表1:employees 列1:id,整型,主鍵 列2:name,字符串,最大長度50,不能為空 列3:age,整型 列4:gender,字符串,最大長度10,不能為空,默認值"…

數據結構歷年考研真題對應知識點(樹、森林)

目錄 5.4.2樹、森林與二叉樹的轉換 1.樹轉換為二叉樹 【樹和二叉樹的轉換及相關性質的推理(2009、2011)】 2.森林轉換為二叉樹 【森林和二叉樹的轉換及相關性質的推理(2014)】 3.二叉樹轉換為森林 【由遍歷序列構造一棵二叉樹并轉換為對應的森林(2020、2021)】 5.4.3樹和…

C# 各版本語法新功能匯總

C# 8.0 以后 官網 C# 7.3 》》in C# 7.2 》》 命名參數、具名參數 》》》 條件 ref 表達式 C# 7.1 》》 default 運算符 default 在C#7.1中得到了改進,不再需要default(T)了 //變量賦值C#7.0 var s "字符串"; s default(s…

LeetCode 算法:電話號碼的字母組合 c++

原題鏈接🔗:電話號碼的字母組合 難度:中等???? 題目 給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。答案可以按 任意順序 返回。 給出數字到字母的映射如下(與電話按鍵相同)。注意 …

SpringCloud教程 | 第九篇: 使用API Gateway

1、參考資料 SpringCloud基礎篇-10-服務網關-Gateway_springcloud gateway-CSDN博客 2、先學習路由,參考了5.1 2.1、建了一個cloudGatewayDemo,這是用來配置網關的工程,配置如下: http://localhost:18080/aaa/name 該接口代碼如…

git clone命令, 克隆遠程倉庫

這個應該是最簡單的命令,當別人扔給你一個*****.git鏈接,你要知道怎么用,但是還需要注意以下幾點: 1. 你在該網站上是否有賬號 2. 你在該網站上的賬號是否是該項目的成員,如果不是,那可能clone不了 3. 本機…

WSL-Ubuntu20.04部署環境配置

1.更換Ubuntu軟件倉庫鏡像源 為了在WSL上使用TensorRT進行推理加速,需要安裝以下環境,下面將按以下順序分別介紹安裝、驗證以及刪除環境: #1.C環境配置 gcc、gdb、g #2.gpu環境 cuda、cudnn #3.Cmake環境 CMake #4.OpenCV環境 OpenCV #5.Ten…

vxe-grid 實現配置式form搜索條件 form搜索條件框可折疊 配置式table

文章目錄 效果圖代碼 效果圖 代碼 <template><div class"app-container"><vxe-grid refxGrid v-bind"gridOptions" v-if"tableHeight" :height"tableHeight"><template #billDate"{ data }"><e…

Zoom視頻會議軟件使用

Zoom是一款廣受歡迎的視頻會議軟件&#xff0c;使用它可以輕松地進行遠程會議、在線培訓和團隊協作等。要充分利用Zoom軟件的功能&#xff0c;以下是詳細具體的使用方法和步驟&#xff1a; 下載安裝 下載&#xff1a;訪問Zoom官方網站&#xff0c;根據使用的操作系統下載相應的…