如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节
C語言中宏定義使用的小細節
#pragma#pragma 預處理指令詳解
在所有的預處理指令中,#Pragma 指令可能是最復雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了一個方法,在保持與C和 C++語言完全兼容的情況下,給出主機或操作系統專有的特征。依據定義,編譯指示是機器或操作系統專有的,且對于每個編譯器都是不同的。
其格式一般為: #Pragma Para
.............etc..
baike.baidu.com/view/1451188.htm
=======================
強制使用函數而不是宏定義的兩種方法:
1: #undef isalpha
出現在isalpha()之前,并且在文件頂部依然包含了.可以強制編譯器使用函數定義.
2:(isalpha)(c)
預處理器不會把這個結構當做宏,而是當做函數調用
時間: 2013-05-12
1.如何區分宏定義中的"宏名稱"和"宏字符串"?對于帶參數的宏又該注意什么? 在宏定義中,"宏名稱"和"宏字符串"是通過"空格"來區分的.編譯器在處理時宏定義時,首先從"#define"后第一個空格開始讀取字符串,直到遇見下一個空格為止,兩個空格之間的字符串為"宏名稱",確定好"宏名稱"之后,本行的所有其他字符串都為"宏字符串"
編寫代碼的過程中,經常會輸出一些調試信息到屏幕上,一般會調用printf這類的函數.但是當調試解決之后,我們需要手工將這些地方刪除或者注釋掉.最近在看這本書,就想到一個方法: 復制代碼 代碼如下: void myprintf(char* fmt, ...){}#ifdef DEBUG#define printf(fmt, args...) myprintf(fmt, ##args)#endif 調試階段帶著DEBUG調試,正式上線就可以把printf變成一個空函
含有if的宏定義當宏定義中含有 if 時1) 定義如下宏#define DC(p) if( foo(p) )fun(p)用在下面的環境中if(k>n)DC(k);elseDC(n);宏替換后,如下if(k>n)if( foo(k) )fun(k);elseif( foo(n) )fun( n );可見, 原來的 if 和 else 不再配對.2) 為了避免這類問題, 我們可以將包含if語句的宏定義為一個整體.#define DC(p) {if( foo(p) ) fun(p);}但是, 替換后
復制代碼 代碼如下: #ifndef QGLOBAL_H#define QGLOBAL_H #define QT_VERSION_STR?? "3.1.2"/*?? QT_VERSION is (major << 16) + (minor << 8) + patch.?*/#define QT_VERSION 0x030102 /*?? The operating system, must be one of: (Q_OS_x) MACX?- Mac OS X
用內聯取代宏:1.內聯函數在運行時可調試,而宏定義不可以;2.編譯器會對內聯函數的參數類型做安全檢查或自動類型轉換(同普通函數),而宏定義則不會: 3.內聯函數可以訪問類的成員變量,宏定義則不能: 4.在類中聲明同時定義的成員函數,自動轉化為內聯函數.文章(一)內聯函數與宏定義 在C中,常用預處理語句#define來代替一個函數定義.例如: #define MAX(a,b) ((a)>(b)?(a):(b)) 該語句使得程序中每個出現MAX(a,b)函數調用的地方都被宏定義中后面的表達式((a)
在C及C++語言中允許用一個標識符來表示一個字符串,稱為宏,該字符串可以是常數.表達式.格式串等.在編譯預處理時,對程序中所有出現的"宏名",都用宏定義中的字符串去代換,這稱為"宏代換"或"宏展開".宏定義是由源程序中的宏定義命令完成的.宏代換是由預處理程序自動完成的.若字符串是表達式,我們稱之為函數式宏定義,那函數式宏定義與普通函數有什么區別呢? 我們以下面兩行代碼為例,展開描述:函數式宏定義:#define MAX(a,b) ((a)>
喜歡讀一些開源項目源碼的人,總是會發現,大神的代碼中總是有那么一些簡短而高效的宏定義,點擊進去一看,發現晦澀難懂,別說學習了,有時候理解都是一種困難,但是宏定義本身并沒有那么難,但是寫出一個好的宏當然還是需要豐富的經驗和技術,接下來就說一說宏定義,看懂大神的宏是第一步,偶爾寫一個也是裝逼的好辦法- 定義: 宏定義分為兩種:一種是對象宏(object-like macro)另一種就是函數宏(function-like macro) 根據名字也可以理解到,對象宏就是用來定義一個量,通過這個宏可以拿到
先簡明扼要,說下關鍵:1.內聯函數在可讀性方面與函數是相同的,而在編譯時是將函數直接嵌入調用程序的主體,省去了調用/返回指令,這樣在運行時速度更快. 2.內聯函數可以調試,而宏定義是不可以調試的.內聯函數與宏本質上是兩個不同的概念如果程序編寫者對于既要求快速,又要求可讀的情況下,則應該將函數冠以inline.下面詳細介紹一下探討一下內聯函數與宏定義. 一.內聯函數是什么?內聯函數是代碼被插入到調用者代碼處的函數.如同 #define 宏(但并不等同,原因見下文),內聯函數通過避免被調用的開銷來提
內聯函數的優越性:一:inline定義的類的內聯函數,函數的代碼被放入符號表中,在使用時直接進行替換(像宏定義一樣展開),沒有了調用的開銷,效率很高.二:類的內斂函數是一個真正的函數.三:使用內聯函數inline可以完全取代表達式形式的宏定義. 例子: 復制代碼 代碼如下: Class A{public:int readTest(){return nTest:}void setTest(int i);};inline void A::setTest(int i){nTest=i;}; 說明:類A
#define 命令#define定義了一個標識符及一個串.在源程序中每次遇到該標識符時,均以定義的串代換它.ANSI標準將標識符定義為宏名,將替換過程稱為宏替換.命令的一般形式為: #define identifier string 注意: 1.該語句沒有分號.在標識符和串之間可以有任意個空格,串一旦開始,僅由一新行結束. 2.宏名定義后,即可成為其它宏名定義中的一部分. 3.宏替換僅僅是以文本串代替宏標識符,前提是宏標識符必須獨立的識別出來,否則不進行替換.例如: #define XYZ t
1. 單行導入與多行導入 在 Go 語言中,一個包可包含多個 .go 文件(這些文件必須得在同一級文件夾中),只要這些 .go 文件的頭部都使用 package 關鍵字聲明了同一個包. 導入包主要可分為兩種方式: 單行導入 import "fmt" import "sync" 多行導入 import( "fmt" "sync" ) 如你所見,Go 語言中 導入的包,必須得用雙引號包含,在這里吐槽一下. 2. 使用別名 在一些場
內存四區 1.代碼區 代碼區code,程序被操作系統加載到內存的時候,所有的可執行代碼都加載到代碼區,也叫代碼段,這塊內存是不可以在運行期間修改的. 2.靜態區 所有的全局變量以及程序中的靜態變量都存儲到靜態區. 3.棧區 棧stack是一種先進后出的內存結構,所有的自動變量,函數的形參都是由編譯器自動放出棧中,當一個自動變量超出其作用域時,自動從棧中彈出.對于自動變量,什么時候入棧,什么時候出棧,是不需要程序控制的,由C語言編譯器.實現棧不會很大,一般都是以K為單位的. 當棧空間以滿,但還往棧
題主要區分清楚內碼(internal encoding)和外碼(external encoding)就好了. 內碼是程序內部使用的字符編碼,特別是某種語言實現其char或String類型在內存里用的內部編碼: 外碼是程序與外部交互時外部使用的字符編碼."外部"相對"內部"而言:不是char或String在內存里用的內部編碼的地方都可以認為是"外部".例如,外部可以是序列化之后的char或String,或者外部的文件.命令行參數之類的. Java語
C語言中的符號常量 在結束討論溫度轉換程序前,我們再來看一下符號常量.在程序中使用 300.20 等類似的"幻數"并不是一個好習慣,它們幾乎無法向以后閱讀該程序的人提供什么信息,而且使程序的修改變得更加困難.處理這種幻數的一種方法是賦予它們有意義的名字.#define 指令可以把符號名(或稱為符號常量)定義為一個特定的字符串: #define 名字 替換文本 在該定義之后,程序中出現的所有在 #define 中定義的名字(既沒有用引號引起來,也不是其它名字的一部分)都將用相應的替換文本
各種數據存放在磁盤或內存中都有其不同的存放格式,因此就存在不同的數據類型.了解各種數據的特性,對編程開發來說是十分重要. 程序中經常會進行一些運算,易語言中的運算都要使用運算符進行識別處理,并通過運算表達式來完成運算操作.程序中對各數據之間的關系的描述也要通過運算符. 1.易語言的數據類型 一個程序內部應包括兩個方面的內容:1.數據的描述.2.操作步驟,即對程序動作的描述. 數據是程序操作的對象,操作的結果會改變數據的內容.打個比方:要做一道菜,做菜前先選擇烹飪的原材料(即對數據進行描述),然后
1.函數:當程序很小的時候,我們可以使用一個main函數就能搞定,但當程序變大的時候,就超出了人的大腦承受范圍,邏輯不清了,這時候就需要把一個大程序分成許多小的模塊來組織,于是就出現了函數概念: ? 函數是C語言代碼的基本組成部分,它是一個小的模塊,整個程序由很多個功能獨立的模塊(函數)組成.這就是程序設計的基本分化方法: (1) 寫一個函數的關鍵: 函數定義:函數的定義是這個函數的實現,函數定義中包含了函數體,函數體中的代碼段決定了這個函數的功能: 函數聲明:函數聲明也稱函數原型聲明,函數的原
結構體的自引用(self reference),就是在結構體內部,包含指向自身類型結構體的指針. 結構體的相互引用(mutual reference),就是說在多個結構體中,都包含指向其他結構體的指針. 1. 自引用 結構體 1.1 不使用typedef時 錯誤的方式: struct tag_1{ struct tag_1 A; /* 結構體 */ int value; }; 這種聲明是錯誤的,因為這種聲明實際上是一個無限循環,成員b是一個結構體,b的內部還會有成員是結構體,依次下去,無線循環.
if 語句 用 if 語句可以構成分支結構,它根據給的條件進行判定,以決定執行哪個分支程序段. C 語言的 if 語句有三種基本形式 第一種形式: if(條件表達式) { 語句1: } if(條件表達式) { 語句1: } 這種形式運行順序為:當條件表達式為真,執行語句1,否則,直接跳過語句1,執行后面的語句. 例子1: BOOL result = YES: if(result) { printf("result is true\n"); } BOOL result = YES: if
在C語言當中,字符串數組可以使用: char a[] [10]; 或者 char *a[]; 表示 第一種表示方式固定了每個字符串的最大大小.第二種沒有字符串的大小限制. #include #include //該程序的功能是 輸入阿拉伯數字的月份數 輸出英文月份 int main() { //一個字符串數組 它的下標代表英文月份的阿拉伯數字 char *month[] = {"January","Februa
總結
以上是生活随笔為你收集整理的如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 男性微信网名大全
- 下一篇: c语言计算器实训任务案例,C/C++经典