C語言 預處理 + 條件編譯宏 + 井號運算符

預處理階段任務

在這里插入圖片描述

預處理指令

在這里插入圖片描述

條件編譯宏

條件編譯宏的作用在于根據編譯時的條件進行代碼的選擇性編譯,從而實現不同環境不同配置不同功能的編譯版本。

這可以用于實現調試模式發布模式的切換,平臺適配,以及選擇性地編譯不同的功能模塊等。通過合理使用條件編譯宏,可以提高代碼的靈活性可維護性可移植性

1
//#ifdef 和 #ifndef:這指令用于判斷某個宏是否已經被定義。
#ifdef DEBUG// 定義了 DEBUG 宏對應的代碼塊
#else// 沒有定義 DEBUG 宏對應的代碼塊
#endif
//判斷出當前是不是WIN32平臺。
#include <stdio.h>int main()
{
#ifdef _WIN32printf("這是win32平臺\n");
#elseprintf("這不是win32平臺\n");
#endif // _WIN32
}
2
//#if:該指令用于在編譯時對表達式進行求值,根據結果判斷是否編譯代碼塊中的內容。
//此處的表達式要求在預處理階段值是可以被求出的,常見的包括宏定義的值、常量、運算表達式等。#if (VALUE == 1)  // 小括號可以省略不寫// 在VALUE為1時執行的代碼
#elif (VALUE == 2)// 在VALUE為2時執行的代碼
#else// 在其他情況下執行的代碼
#endif
//根據宏 VALUE 的值,編譯器會根據條件選擇性地編譯 #if、#elif 或 #else 后面的代碼塊。
#define VALUE 5
int main()
{int number = 5;
#if VALUE > 5number += 10;
#elif VALUE < 5number *= 10;
#elsenumber++;
#endif printf("number = %d\n", number);
}

pragma

#pragma 是C和C++語言中的一個預處理指令,用于向編譯器發出特定的指示或命令

//用于防止頭文件的重復包含
#pragma once
// 頭文件的內容
//#pragma pack:用于設置結構體的內存對齊方式。#pragma pack 可以設置結構體成員的對齊方式,以便在內存中緊湊地存儲數據。// 將當前的對齊方式壓棧,并設置為 n 字節對齊
#pragma pack(push, n)   
// 結構體定義和成員
#pragma pack(pop)       // 恢復之前的對齊方式
//#pragma warning:用于控制編譯器警告的輸出級別。#pragma warning 可以修改編譯器輸出的警告信息級別。// 禁用指定警告
#pragma warning(disable: warning_number)   
// 恢復指定警告到默認級別
#pragma warning(default: warning_number)   

實際上各個編譯器還支持各種不同的 pragma 指令,具體的使用方法和支持的指令可以參考編譯器的文檔或手冊。需要注意的是,pragma 指令的具體行為和效果在不同的編譯器之間可能有所不同,并且使用 pragma 指令可能導致代碼的可移植性降低。因此,在使用 pragma 指令時應當謹慎,并考慮平臺和編譯器的兼容性。

井號運算符 ‘#’

在C和C++中,# 運算符(井號運算符)用于將宏參數轉換為字符串常量

#include <stdio.h>
#define STRINGIZE(x) printf(""#x" value is %d\n", (x))int main() 
{int number = 666;STRINGIZE(number);return 0;
}輸出:
number value is 666

在這里插入圖片描述

拼接運算符 ‘##’

是宏預處理運算符,稱為連接運算符拼接運算符。它只能在宏定義中使用,用于將兩個符號(可以是標識符、關鍵字或其他字符)連接在一起形成一個新的標識符

#include <stdio.h>
#define NAME(n) yyds##n
#define STRNAME(n) "yyds_"#n""
#define STRINGIZE(x) printf("yyds"#x" value is %d\n", yyds##x)int main() 
{int NAME(1) = 100;int NAME(2) = 200;int NAME(3) = 300;STRINGIZE(1);STRINGIZE(2);STRINGIZE(3);printf("%s\n", STRNAME(Leifeng));printf("%s\n", STRNAME(9527));return 0;
}輸出:
yyds1 value is 100
yyds2 value is 200
yyds3 value is 300
yyds_Leifeng
yyds_9527

在這里插入圖片描述

詳細教程可轉

愛編程的大丙

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

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

相關文章

Git merge 與 Git rebase 與 Git fetch

Git merge 與 Git rebase 看這個圖就行了 git merge、git rebase 和 git fetch 是 Git 中的三個不同的命令&#xff0c;它們分別用于不同的目的。以下是它們的主要區別&#xff1a; git merge&#xff08;合并&#xff09;&#xff1a; 用途&#xff1a; 用于將一個分支的更改…

基于hadoop下的spark安裝

目錄 簡介 安裝準備 spark安裝 配置文件配置 簡介 Spark主要?于?數據的并?計算&#xff0c;?Hadoop在企業主要?于?數據的存儲&#xff08;?如HDFS、Hive和HBase 等&#xff09;&#xff0c;以及資源調度&#xff08;Yarn&#xff09;。但是也有很多公司也在使?MR2進…

【Spring教程24】Spring框架實戰:從零開始學習SpringMVC 之 SpringMVC入門案例代碼示例

目錄 1:創建Maven項目&#xff0c;并導入對應的jar包2:創建控制器類3:創建配置類4:創建Tomcat的Servlet容器配置類5:配置Tomcat環境6:啟動運行項目7:瀏覽器訪問8:知識點總結 歡迎大家回到《Java教程之Spring30天快速入門》&#xff0c;本教程所有示例均基于Maven實現&#xff0…

【數學建模】《實戰數學建模:例題與講解》第八講-回歸分析(含Matlab代碼)

【數學建模】《實戰數學建模&#xff1a;例題與講解》第八講-回歸分析&#xff08;含Matlab代碼&#xff09; 回歸分析基本概念經典多元線性回歸&#xff08;MLR&#xff09;主成分回歸&#xff08;PCR&#xff09;偏最小二乘回歸&#xff08;PLS&#xff09;建模過程應用和優勢…

2023年12月11日-12月17日(項目需求+ue5底層渲染)

可以試試每小時項目需求內容ue5底層渲染交替進行。 周一&#xff1a; 6&#xff1a;11–&#xff0c;ue5底層渲染02A15

C# List類常用操作 之 查找

// // // 作者&#xff1a;鳥哥 // // email:xiaoniao2003gmail.com // // using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization.Formatters;class Program {class Student{internal string Name;internal int Ag…

Pandas實踐_pandas基礎

文章目錄 一、文件的讀取和寫入1.文件讀取2.數據寫入 二、基本數據結構1.Series2.DataFrame 三、常用基本函數1.匯總函數2.特征統計函數3.唯一值函數4.替換函數5.排序函數6.apply方法 四、窗口對象1.滑窗對象2.擴張窗口 一、文件的讀取和寫入 1.文件讀取 pandas可以讀取的文件…

rust宏(macro)詳解

前言 rust 學習曲線非常陡峭&#xff0c;但是基本語法也還算挺好理解&#xff0c;自動內存管理有點類似智能指針&#xff0c;基本看一下語法入門就可以大概理解&#xff0c;但是唯獨宏很難理解&#xff0c;語法非常晦澀。但是功能非常強大。聲明宏類似于c語言的宏處理&#xf…

docker-ubuntu中基于keepalived+niginx模擬主從熱備完整過程

一、環境準備 &#x1f517;在Ubuntu中安裝docker 二、主機 1、環境搭建 1.1 鏡像拉取 docker pull ubuntu:16.041.2 創建網橋 docker network create -dbridge --subnet192.168.126.0/24 br11.3 啟動容器 docker run -it --name ubuntu-1 --privileged -v /home/vac/l…

為 Compose MultiPlatform 添加 C/C++ 支持(2):在 jvm 平臺使用 jni 實現桌面端與 C/C++ 互操作

前言 在上篇文章中我們已經介紹了實現 Compose MultiPlatform 對 C/C 互操作的基本思路。 并且先介紹了在 kotlin native 平臺使用 cinterop 實現與 C/C 的互操作。 今天這篇文章將補充在 jvm 平臺使用 jni。 在 Compose MultiPlatform 中&#xff0c;使用 jvm 平臺的是 An…

Kubernetes實戰(十)-升級k8s集群

1 Kubernetes(k8s) 集群升級過程 Kubernetes 使用 kubeadm 工具來管理集群組件的升級。在集群節點層面&#xff0c;升級 Kubernetes(k8s)集群的過程可以分為以下幾個步驟&#xff1a; 1&#xff09;檢查當前環境和配置是否滿足升級要求。 2&#xff09;升級master主節點&…

如何一個例子玩明白GIT

一個例子玩明白GIT GIT的介紹和教程五花八門&#xff0c;但實際需要用的就是建倉、推送、拉取等操作&#xff0c;這兒咱可以通過一個例子熟悉這些操作&#xff0c;一次性搞定GIT的使用方法學習。下面這個例子的內容是內容是建立初始版本庫&#xff0c;然后將數據復制到 "遠…

輕量封裝WebGPU渲染系統示例<45>- 材質組裝流水線(MaterialPipeline)燈光、陰影、霧(源碼)

當前示例源碼github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/MaterialPipelineFog.ts 當前示例運行效果: 此示例基于此渲染系統實現&#xff0c;當前示例TypeScript源碼如下&#xff1a; export class MaterialPipelineFog {pr…

數組創建方法

數組的創建 1.let a[] 2.let anew Array(5) 3.let anew Array(1,2,3) 4.let a[1,2,3] 創建數組是空還是有值是以上四種寫法。但是如果沒給值的變量是undefined&#xff0c;再a[0]找不到這種變量的。所以當找某一個數需要已經是數組內存。不想給值可以給空數組。只要是數組…

MEMS制造的基本工藝介紹——晶圓鍵合

晶圓鍵合是一種晶圓級封裝技術&#xff0c;用于制造微機電系統 (MEMS)、納米機電系統 (NEMS)、微電子學和光電子學&#xff0c;確保機械穩定和氣密密封。用于 MEMS/NEMS 的晶圓直徑范圍為 100 毫米至 200 毫米&#xff08;4 英寸至 8 英寸&#xff09;&#xff0c;用于生產微電…

【重點】【環鏈表入口】142. 環形鏈表 II

題目 public class Solution {public ListNode detectCycle(ListNode head) {if (head null || head.next null) {return null;}ListNode slow head, fast head;while (fast ! null && fast.next ! null) {slow slow.next;fast fast.next.next;if (slow fast) …

SQL語句---更新數據

介紹 使用sql語句更新數據。 命令 update 表名 set 字段1值1[,字段2值2] [where 條件表達式];[]&#xff08;方括號&#xff09;內的表是表示可選。 例子 將a表id值等于1的數據的名稱改為666 update a set name666 where id1;

2023-12-05 Qt學習總結7

點擊 <C 語言編程核心突破> 快速C語言入門 Qt學習總結 前言二十 QTcpSocket QTcpServer網絡庫服務端代碼:客戶端代碼 二十一 QProcess進程類二十二 QThread線程總結 前言 要解決問題: 學習qt最核心知識, 多一個都不學. 二十 QTcpSocket QTcpServer網絡庫 QTcpSocket和…

持續集成交付CICD:Jenkins流水線實現Nexus制品晉級策略

目錄 一、理論 1.開發測試運維環境 二、實驗 1.Nexus制品晉級策略 一、理論 1.開發測試運維環境 &#xff08;1&#xff09;環境 1&#xff09;持續集成開發環境&#xff08;DEV: Development Environment&#xff09; 直接通過源代碼編譯打包&#xff0c;其會跑單元測試…

python 筆記 :trajectory_distance包(如何可以正確使用)【debug篇】

包的地址&#xff1a;maikol-solis/trajectory_distance (github.com) 1 模塊介紹 用Cython實現的Python模塊&#xff0c;用于計算二維軌跡之間的距離 trajectory_distance包提供了9種軌跡間的距離計算方法&#xff1a; SSPD&#xff08;對稱線段路徑距離&#xff09;OWD&a…