define總結 (網上資料匯集)

2021-09-30 08:09:40 字數 2485 閱讀 3749

1. 定義簡單的常數:定義常量,便於修改(切不可在後面加上分號!)

#define n 1000

等效於 const int n = 1000; 但略有不同,define只是簡單替換,而不是作為乙個量來使用.

2. 定義簡單的函式:注意多使用括號

define可以像函式那樣接受一些引數,如下:

#define max(x,y) (x)>(y)?(x):(y);

這個定義就將返回兩個數中較大的那個,看到了嗎?因為這個「函式」沒有型別檢查,就好像乙個函式模板似的,當然,它絕對沒有模板那麼安全就是了。可以作為乙個簡單的模板來使用而已。但是這樣做的話存在隱患,例子如下:

#define add(a,b) a+b;

在一般使用的時候是沒有問題的,但是如果遇到如:c * add(a,b) * d的時候就會出現問題,代數式的本意是a+b然後去和c,d相乘,但是因為使用了define(它只是乙個簡單的替換),所以式子實際上變成了

c*a + b*d

另外舉乙個例子:

#define pin (int*);

pin a,b;

本意是a和b都是int型指標,但是實際上變成int* a,b;

a是int型指標,而b是int型變數。

這是應該使用typedef來代替define,這樣a和b就都是int型指標了。

所以我們在定義的時候,養成乙個良好的習慣,建議所有的層次都要加括號。

3. 定義單行巨集:主要有以下三種用法.

1) 前加##或後加##,將標記作為乙個合法的識別符號的一部分.注意,不是字串.多用於多行的巨集定義中.例如:

#define a(x)  t_##x

則 int a(1) = 10; //等效於int t_1 = 10;

#define a(x)  tx##__

則 int a(1) = 10; //等效於int t1__ = 10;

2) 前加#@,將標記轉換為相應的字元,注意:僅對單一標記轉換有效(理解有誤?)

#define b(x) #@x

則b(a)即』a』,b(1)即』1』.但b(abc)卻不甚有效.

3) 前加#,將標記轉換為字串.

#define c(x) #x

則c(1+1) 即 」1+1」.

4. 定義多行巨集:注意斜槓的使用,最後一行不能用斜槓.

#define declare_rtti(thisclass, superclass)/

virtual const char* getclassname() const/ 

/static int istypeof(const char* type)/

/virtual int isa(const char* type)/

/static thisclass* safedowncast(ditkobject* o)/

5. 用於條件編譯:(常用形式)

#ifndef _aaa_h

#define _aaa_h

//c/c++**

#endif

在大規模的開發過程中,特別是跨平台和系統的軟體裡,define最重要的功能是條件編譯。就是:

#ifdef windows

......

......

#endif

#ifdef linux

......

......

#endif

可以在編譯的時候通過#define設定編譯環境

5.如何定義巨集、取消巨集

//定義巨集

#define [macroname] [macrovalue]

//取消巨集

#undef [macroname]

普通巨集#define pi (3.1415926)

帶引數的巨集

#define max(a,b) ((a)>(b)? (a),(b))

關鍵是十分容易產生錯誤,包括機器和人理解上的差異等等。

6.條件編譯

#ifdef ***…(#else) …#endif

例如 #ifdef dv22_aux_input

#define aux_mode 3 

#else

#define auy_mode 3

#endif

#ifndef *** … (#else) … #endif

7.標頭檔案(.h)可以被標頭檔案或c檔案包含;

重複包含(重複定義)

由於標頭檔案包含可以巢狀,那麼c檔案就有可能包含多次同乙個標頭檔案,就可能出現重複定義的問題的。

通過條件編譯開關來避免重複包含(重複定義)

例如#ifndef __headerfile***__

#define __headerfile***__

檔案內容

#endif 

8. 一些注意事項:

1) 不能重複定義.除非定義完全相同.#define a(x) … 和#define a 是重複定義.

2) 可以只定義符號,不定義值.如#define aaa

《結網》 讀後總結

之前也看過產品經理相關的書籍 啟示錄 這次還是從書單裡面挑了這本 結網 結網的作者就是著名的糗事百科創始人。之前連續幾年看了幾年的糗百,所以慕名拜讀這本書。豆瓣 結網 溝通是人與人日常交流必不可少的部分,即便是天天寫 的程式設計師也是需要時常與人溝通的。比如詢問技術負責人一些方案是否可行,與產品經理...

暑期總結 網路流

一張圖中每條邊都有同一時間能承載的最大資料量,求最大網路流即求從起點到終點同一時間能運輸的最大資料量。找到一條從起點到終點的路,那麼這條路上運輸的資料量為權值最小的邊的權值,然後再依次做下去,但這樣過早地阻塞了後面的流,會造成無法得到最優解。解決的方法是新增一條反向邊,如果邊 流過了k 那麼反向邊 ...

SQLite3與SQL差異小結 網上的

1 top 這是乙個大家經常問到的問題,例如在sqlserver中可以使用如下語句來取得記錄集中的前十條記錄 select top 10 from index order by indexid desc 但是這條sql語句在sqlite中是無法執行的,應該改為 select from index o...