預處理程式

来源:http://www.cnblogs.com/fangjingjing/archive/2016/09/17/5879634.html
-Advertisement-
Play Games

預處理程式 預處理程式語句使用井號(#)標記,這個符號必須是一行中的第一個非空格字元。 #define 語句(這種預定義通常也被稱為定義“巨集”): #define 語句的基本用途之一就是給符號名稱指定程式常量。 例如: #define Constant 1//預處理程式語句後面不要加分號(;) ,因 ...


 

--------預處理程式--------

  • 預處理程式語句使用井號(#)標記,這個符號必須是一行中的第一個非空格字元。

 

  • #define 語句(這種預定義通常也被稱為定義“巨集”):
    • #define 語句的基本用途之一就是給符號名稱指定程式常量。 例如:
    • #define  Constant  1
      //預處理程式語句後面不要加分號(;)  ,因為預定義名稱一齣現,預處理程式就會將右邊的所有字元替換到程式中去。所以在預處理程式語句的後面不需要加 分號(;)  ,不然也會一併替換到程式中



    • 代碼定義了程式常量 Constant ,並使他的值等於 1 。在這之後,在任何需要常量 1 的地方都可以用 Constant 來替代。預處理程式會在程式中將這個名稱(Constant)替換為預定義的值 1。
    • 預處理程式會將 #define  語句中預定義名稱右邊的所有字元都替換到程式中去。所以在預定義名稱的右邊,可以是常量、語句、代碼或是任何有意義的東西。
    • #define 語句經常放在程式的開始,但 #import 或 include 語句之後。這並不是必須的,他們可以出現在程式的任何地方。但是,在程式中應用這個名稱之前,必須先定義他們。
    • 預定義的名稱和變數的行為方式不同,沒有局部定義之類的說法。在定義一個名稱之後,就可以在程式的任何地方使用它。
    • 預定義的值本身可以引用另一個預定義的值。
    • 定義帶有參數的巨集:
      • 在定義帶有參數的名稱時,預定義名稱的參數列表的左括弧之間不允許空格。   

        帶參數的巨集定義的一般形式如下:#define <巨集名>(<參數表>) <巨集體> 

         其中, <巨集名>是一個標識符,<參數表>中的參數可以是一個,也可以是多個,視具體情況而定,當有多個參數的時候,每個參數之間用逗號分隔。<巨集體>是被替換用的字元串,巨集體中的字元串是由參數表中的各個參數組成的表達式。例如:

        #define SUB(a,b) a-b 

        如果在程式中出現如下語句:

         result=SUB(2, 3); 

        則被替換為:

        result=2-3;

         如果程式中出現如下語句:

         result= SUB(x+1, y+2); 

        則被替換為:

        result=x+1-y+2; 

        在這樣的巨集替換過程中,其實只是將參數表中的參數代入到巨集體的表達式中去,上述例子中,即是將表達式中的a和b分別用2和3代入。

        我們可以發現:帶參的巨集定義與函數類似。如果我們把巨集定義時出現的參數視為形參,而在程式中引用巨集定義時出現的參數視為實參。那麼上例中的a和b就是形參,而2和3以及x+1和y+2都為實參。在巨集替換時,就是用實參來替換<巨集體>中的形參。

         

    • 預處理程式換行規則:
      • 通常,預處理程式假設定義包含在程式的一行中。如果需要第二行,那麼上一行的最後一個字元必須是反斜杠線符號(\)。這個字元告訴預處理程式這裡存在一個後續。對於多個後續行也同樣是如此。

 

 

 

 

  • #import  語句(導入文件指令):
    • 導入文件最出色的能力之一是他是你能夠把定義集中起來,從而確保所有的程式應用相同的值。
    • //例句:
      #import "file.h"

       

    • Objective-C中,#import 被當成 #include 指令的改良版本來使用。除此之外,#import 確定一個文件只能被導入一次,這使你在遞歸包含中不會出現問題
      @class一般用於頭文件中需要聲明該類的某個實例變數的時候用到,在m文件中還是需要使用#import
      @class就是告訴編譯器有這麼一個類,至於類的定義是啥不知道
      @class一般用於頭文件中需要聲明該類的某個實例變數的時候用到,在m文件中還是需要使用#import
      #import<> 跟 #import""又什麼區別?
      “”的意思是自己創建的文件,用這個首先會在當前的目錄中尋找,如果找不到就到其他的位置尋找,“”和<>是相對的一個是自己創建的文件一個是系統的文件

 

 

  • 條件編譯:
    • 條件編譯通常用於創建可以在不同系統上編譯運行的程式。他還經常用來開關程式中的各種語句。
    • #ifdef、#endif、#else和#ifndef語句:  
      //例:如果前面已經定義了一個符號(IPAD),下麵的語句就把 kImageFiel 定義為 @"barnHD.png"  ,否則就定義為  @"barn.png" 
      #ifdef IPAD
      
      #define kImageFile @"barnHD.png"
      
      #else 
      
      #define kImageFile @"barn.png"
      
      #endif

      //如果程式編譯時,#ifdef 行中所指定的符號已經通過 #define 語句或命令行定義了,那麼編譯器將處理從此處開始到 #else 、#elif 或 #endif 的程式段,否則將忽略這個程式段。

       

    • #if 和 #elif 預處理程式語句:
      •  if 語句可以用來檢測常量表達式是否為零。如果表達式結果為非零,就會處理到 #else、#elif 或 #endif 位置的所有後續行。否則將跳過他們。
    • //例:這裡講預定義變數 MAC_OS_X_VERSION_MIN_REQUIRED 的值與預定義變數 MAC_OS_X_VERSION_10_5 的值進行比較。如果前者小於後者,就處理隨後的 #define 

      #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5

      #define NSMaximumStringLength (INT_MAX-1)
      #endif


      //特殊運算符
      define(name) 也可以用在#if語句中

      #if defined(DEBUG)
      ……
      #endif



      #if DEBUG
      ……
      #endif

      的作用相同

       

    • #undef 語句:
      • 在一些情況下,可能需要使一些已經定義的名稱成為未定義的,通過使用 #undef 語句就可以實現。
      • 要消除特定名稱的定義,編寫如下語句
      • #undef name

         

 


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

-Advertisement-
Play Games
更多相關文章
  • 介紹一個生成動態鏈接庫*.so的例子: 首先新建1個頭文件test.h: 然後新建3個源文件first.c/second.c/third.c: first.c: second.c: third.c: 然後,生成動態鏈接庫libtest.so: gcc first.c second.c third.c ...
  • 編譯環境:windows 7 64位 編譯工具:codeblocks 13.12 備註:未使用graphics.h 聲明:個人原創,未經允許,禁止轉載!!! 數據結構:雙向鏈表 1.程式未使用graphis.h中的 函數,所以採用先清屏,再列印的方式顯示圖形,大約每秒刷新一次; 2.除蛇頭元素外,其 ...
  • 在EL表達式中,假設某個entity的status屬性為char類型,此處假設為'1',在jsp中,對於${entity.status=='1'},我們預期的結果是true,但實際上是false - -! why?是這樣的,EL表達式比較偷懶,把char類型數據做了自動轉型,所以上面的EL換一種寫法 ...
  • 建議52:推薦使用String直接量賦值 一般對象都是通過new關鍵字生成的,但是String還有第二種生成方式,也就是我們經常使用的直接聲明方式,這種方式是極力推薦的,但不建議使用new String("A")的方式賦值。為什麼呢?我們看如下代碼: 註意看上面的程式,我們使用"=="判斷的是兩個對 ...
  • 1.如何獲取某個方法 方法的名稱和方法的參數列表才能唯一決定一個方法 2.方法反射的操作 method.invoke(); 如果方法是private的會報這個錯誤 java.lang.IllegalAccessException ...
  • carbaugh/lice "lice" : Generate license files for your projects 一個用來為你的項目生成許可證的工具。這下可方便了,不用手工的去修改了! coleifer/peewee "peewee" : a small, expressive orm ...
  • 一、首先先在碼雲上新建一個項目 二、複製項目的鏈接 三、打開SmartGit,點擊clone 4、把複製的項目鏈接粘上去 5、然後點兩次next,選擇一個路徑,finish 6、打開剛剛選擇的路徑,我們能看到: 7、現在我們要把我們自己的maven項目粘進去 8、做完之後,我們能夠看到SmartGi ...
  • 題目鏈接 http://acm.hdu.edu.cn/showproblem.php?pid=5881 Problem Description Tea is good.Tea is life.Tea is everything.The balance of tea is a journey of p ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...