1.巨集定義
語法: #define 巨集名字[(形參表)] 替換文字
其中,巨集名字是乙個識別符號;
形參表為:(形參名1, 形參名2,...形參名n), 沒有型別;
替換文字是一串字元.
巨集呼叫和函式呼叫不同,是把程式中所有巨集呼叫 "巨集名字(實參表)", 用替換文字(實參代替形參)代替.
沒有函式的跳轉過程.
例如:#define mul(x, y) ((x) * (y))
注意:此處必須加括號,否則,
(1)mul(x - 1, y + 1); 展開為 x - 1 * y + 1; //內層必須加()
(2)1 / mul(x, y); 展開為1 / x * y; //外層也必須加()
另外,替換時,實參盡可能不要有***.
例如:
#define max(x, y) ((x) > (y) ? (x) : (y))
max(x++, y) 展開為 ((x++) > (y) ? (x++) : (y))
2.檔案包含
#include "檔名"
標頭檔案(*.h)一般包含:
型別定義,巨集定義,函式原型,外部變數定義.
呼叫其它檔案中函式的**,是在link的過程中由linker將*.obj檔案進行link處理的.
3.條件編譯
#if 條件1
**1#else 條件2
**2#endif
4.引數個數不確定的函式
形參表寫法:(形參型別1 形參名1, ..., 形參型別n 形參名n, ... )
在程式中如何獲取不確定的引數?
函式庫提供了 stdarg.h, 乙個型別, 2個巨集.
typedef void * va_list; //va_list是乙個指標型別
va_start(p, para); //para是最後乙個確定引數的名字,這個巨集給指標變數p賦初值,指向第乙個不確定的引數
變數 = va_arg(p, 型別說明符);
//取出p所指的不定引數的值,型別說明符說明了這個值的型別,同時p自動的改指下乙個可變引數.
示例程式**如下:
#include "stdio.h"
#include "stdarg.h"
#include "stdlib.h"
void scanf_e(char *c, ...)
c++;}}
void main()
《補充》
找了一下源**, .
#define _intsizeof(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _intsizeof(v) )
#define va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )
#define va_end(ap) ( ap = (va_list)0 )
這裡的巨集 _intsizeof(n) 挺有意思。
例如:
#include
struct student
; struct student s1, s2;
#define size(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))
int main()
輸出結果:
4373256
4373280
24 相差24個位元組,而不是3 * 4 + 10 = 22個。
巨集_intsizeof(n) 達到此目的。
牛。
王老師 C 類模板
1.定義語法 template 模板參數列 class 類名 類體 注 模板型別引數 typename id 模板非型別引數 例如 int n 類體中可以出現的型別有 a.基本資料型別 b.使用者自定義型別 c.模板型別引數 d.類名 2.模板例項化 1 從類模板生成具體類的過程 2 時機 定義物件...
王老師 C 類的繼承
1.類的繼承 語法 class 匯出類名 繼承方式 基類名1,繼承方式 基類名n 類體 繼承方式有public,protected,private三種.匯出類物件構成 1 基類的物件 2 匯出類部分.匯出類中成員的訪問許可權,如下表所示.繼承方式 基類private成員 基類protected成員 ...
王老師喜歡哪張牌?
結論 王老師喜歡方塊五 a 我不知道是哪張 解讀 王老師喜歡的牌同點色有不同花色 排除 黑桃 2,3,7,8,j 梅花 6,k 剩餘 黑桃 4 紅桃 a,4,q 梅花 4,5,q 方塊 a,5 b 我知道你不知道,但是我也不知道 解讀 說明同色的所有的牌都有其他顏色存在,並且同色牌不止1張 eg 如...