C_C語言環境、編譯、預處理

来源:https://www.cnblogs.com/chungeyuan/archive/2019/08/26/11410243.html

1、環境 2、編譯 預處理: gcc E main.c o main.i 編譯: gcc S main.i o main.s //同時做語法檢查 彙編: gcc c main.s o main.o 鏈接: gcc main.o o main.exe 3、4996錯誤 4、預處理 4.1 巨集 巨集定義 ...


1、環境

gcc -v                 //查看環境變數
gcc 同 g++
gcc main.c -o main.exe
gcc main.c             //預設生成a.exe

2、編譯

預處理:   gcc -E main.c -o main.i
編譯:      gcc -S main.i -o main.s       //同時做語法檢查
彙編:      gcc -c main.s -o main.o
鏈接:      gcc main.o -o main.exe

3、4996錯誤

// 主要存在於scanf,strcpy,sprintf等
#pragma warning(disable:4996)          //防止4996錯誤
#define _CRT_SECURE_NO_WARNINGS        //防止4996錯誤

4、預處理

4.1 巨集

  • 巨集定義

說明:
  1)巨集名一般用大寫,以便於與變數區別;
  2)巨集定義可以是常數、表達式等;
  3)巨集定義不作語法檢查,只有在編譯被巨集展開後的源程式才會報錯;
  4)巨集定義不是C語言,不在行末加分號;
  5)巨集名有效範圍為從定義到本源文件結束;
  6)可以用#undef命令終止巨集定義的作用域;
  7)在巨集定義中,可以引用已定義的巨集名;
  8)用括弧括住每一個參數,並括住巨集的整體定義。

  • 巨集常量
    • #define PI 3.14
    • 特殊巨集定義
      __FILE__ 巨集所在文件的源文件名
      __LINE__ 巨集所在行的行號
      __DATE__ 代碼編譯的日期
      __TIME__ 代碼編譯的時間
  • 巨集函數
#define MYADD(x,y)  ((x)+(y))
/*
1)巨集的名字中不能有空格,但是在替換的字元串中可以有空格。ANSI C允許在參數列表中使用空格;
2)用括弧括住每一個參數,並括住巨集的整體定義。
3)用大寫字母表示巨集的函數名。
4)如果打算巨集代替函數來加快程式運行速度。假如在程式中只使用一次巨集對程式的運行時間沒有太大提高。
*/

4.2 條件編譯

  • 一般情況下,源程式中所有的行都參加編譯。但有時希望對部分源程式行只在滿足一定條件時才編譯,即對這部分源程式行指定編譯條件。
  • 測試存在
#define 標識符
...
#ifdef 標識符
    程式段1
#else
    程式段2
#endif

#define DEBUG
#ifdef DEBUG

void func()
{
    printf("debug版本調用\n");
}

#else
void func()
{
    printf("release版本調用\n");
}
#endif
  • 測試不存在
#define 標識符
...
#ifndef 標識符
    程式段1
#else
    程式段2
#endif
  • 根據表達式定義
#if 表達式
    程式段1
#else
    程式段2
#endif

#if 1
void func()
{
    printf("debug1版本調用\n");
}
#else
void func()
{
    printf("debug2版本調用\n");
}
#endif

您的分享是我們最大的動力!

更多相關文章
  • 1.add添加 2.discard刪除 3.update批量添加 4.intersection取交集 5.union取並集 6.difference取差集 7.symmetric_difference對稱差集 ...
  • 說,我有一個需求,就是一個臨時功能。由於工作開發問題,我們有一個B項目,需要有一個商品添加的功能,涉及到添加商品內容,比如商品名字,商品描述,商品庫存,商品圖片等。後臺商品添加的介面已經寫完了,但是問題是目前沒有後臺頁面,就是產品還沒有出後臺詳細頁面。前端已經完備了,上線了。後臺還需要工作時間處理。 ...
  • SpringBoot預設使用Tomcat作為嵌入式的Servlet容器; 1、如何定製和修改Servlet容器的相關配置; 1、修改和server有關的配置(ServerProperties【也是EmbeddedServletContainerCustomizer】); 2、編寫一個Embedded ...
  • 說起應用分層,大部分人都會認為這個不是很簡單嘛 就`Controller`,`Service`, `Mapper`三層。看起來簡單,很多人其實並沒有把他們職責劃分開,在很多代碼中,`Controller`做的邏輯比`Service`還多,`Service`往往當成透傳了,這其實是很多人開發代碼都沒有... ...
  • 新聞 "高效的F ,提示與技巧" "Fable 社區資源" "Visual Studio提示與技巧:為.NET增加生產力" "無風險地嘗試Compositional IT的培訓包——如果沒有增加任何價值,可以得到完全退款" ".NET Core與systemd" "在Visual Studio中通過 ...
一周排行
  • 前言 現在.net core跨平臺了,相信大部分人都把core的程式部署在了linux環境中,或者部署在了docker容器中,與之對應的,之前都是部署在windows環境中,在win中,我們可以用windbg來調試。但是在linux環境下 我們可以採用lldb(這隻是一種,還有其他方式) 環境 li ...
  • 一、WPF的Image控制項中設置ImageSource 還可以使用: 還可以使用: 二、Bitmap轉BitmapImage 先將Bitmap儲存成memorystream,然後指定給BitmapImage 三、Bitmap轉BitmapSource 四、BitmapSource轉Bitmap ...
  • 名詞: IWorkspaceFactory 工作空間工廠 ShapeFileWorksapceFactory 矢量文件工作空間工廠 IWorkspce 工作空間 IFeatrueWorkspace 要素工作空間 IFeatureClass 要素類 IFeatureLayer 要素圖層 Feature ...
  • 一、背景 最近在精讀 《CLR Via C 》和 《Effective C 》 的時候,發現的一個問題點。一般來說,我們實現 介面,是為了釋放托管資源和非托管資源。不過在 C 類型定義裡面有一個功能類似的東西,那就是 終結器 。 最開始我是學 C++ 的,之後學 C 的時候發現這玩意兒不論是寫法和作 ...
  • 1、Readonly成員 可將readonly修飾符應用於結構的任何成員,它指示該成員不會修改狀態。這比將readonly修飾符應用於struct聲明更精細。 像大多數結構一樣ToString()方法不會修改狀態。可以通過readonly修飾符添加到ToString()的聲明來對此進行指示: 上述更 ...
  • 轉發:https://www.cnblogs.com/Ninputer/archive/2008/11/22/generic_covariant.html 背景知識:協變和逆變 假設有這樣兩個類型:TSub是TParent的子類,顯然TSub型引用是可以安全轉換為TParent型引用的。如果一個泛型 ...
  • 在文檔屬性中,可以設置諸多關於文檔的信息,如創建時間、作者、單位、類別、關鍵詞、備註等摘要信息以及一些自定義的文檔屬性。下麵將通過C#程式來演示如何設置,同時對文檔內的已有信息,也可以實現讀取或刪除等操作。 示例大綱: 1. 添加文檔屬性 1.1 添加摘要信息 1.2 添加自定義文檔信息 2. 讀取 ...
  • 這篇文章粗略指引怎麼搭建.Net Core API,並使用Swagger服務。非常適合初學者,網上也有很多。 ...
  • 微軟官方概述: 在C 中,協變和逆變能夠實現數組類型、委托類型和泛型類型參數的隱式引用轉換。協變保留分配相容性,逆變則與之相反。 協變:能夠使用與原始指定的派生類型相比,派生程度更大的類型。 逆變:能夠使用派生程度更小的類型。 官方示例: 上面示例中,從 string object 的隱式轉換這是協 ...
  • 前端 後端 技術要點: 1.上傳附件<input type="file" name="goodsfile" id="goodsfile" class="layui-input" accept="application/vnd.openxmlformats-officedocument.spreads ...
x