導航:首頁 > 源碼編譯 > 宏編譯開關

宏編譯開關

發布時間:2022-01-14 08:20:56

1. #if 及宏定義,是不是C語言里常有這種「開關」用法

#if確實是起到了一個開關作用,但是不同於if語句,if語句只是執行流的變化,最終代碼還是被編譯了,用#if的話,只有後面為真的情況下才編譯,你上面的定義後面需要跟數字,比如
#define USE_Port_B 0
那麼相應的代碼就不會被編譯,說一個簡單的情況
#if WINDOWS
//code
#endif
比方說你檢查系統的時候,如果是windows的話就定義宏WINDOWS,就是說只有在windows下才會編譯code部分

54文人網

2. C語言宏的問題

如果NDEBUG沒有定義則#define assert(exp)((void)0)

如果NDEBUG已經定義則向下執行,碰到#ifdef _cplusplus

如果_cplusplus已經定義,則#define assert(exp)(void)((exp)||(_assert(#exp,_FILE_,_LINE_),0))

如果_cplusplus沒有定義,則執行:
extern "C"{
#endif
_CRTIMP void _cdecl _assert(void*,void*,unsigned);
#ifdef _cplusplus
}

這種主要用在頭文件中,防止頭文件的重復調用。

3. EXCEl宏運行編譯錯誤是怎麼回事

這是隱藏程序的VBA代碼執行出錯。解決方法:

1)在Excel中按 Alt+F11 打開宏編輯器;



2)在宏編輯器中按 Ctrl+R 打開 工程資源管理面板(如果已打開,按 Ctrl+R 後不會有任何變化);


3)在工程資源管理面板中找到你的那個文件,點開,檢查是否存在「模塊n」(n為1、2……),在這些模塊上逐個點右鍵,「移除模塊n」。


4)最後保存,即可。

4. 怎麼利用宏定義,分別編譯Debug版和Release版

乘,卜式未必窮一經。還須黑頭

5. 宏替換,宏展開到底分別在什麼時候進行

//在宏 使用的時候 分為

宏定義 和 宏展開, 你那個 宏替換就是展開

宏定義是你自己寫的 #define
然後展開在預編譯時候處理
這個時候編譯器先掃描一遍文件 把用到宏的地方都做字元替換

比如
#define M 1

int a = M;
那麼預編譯的時候就把 M 替換成1

注意宏只做文本替換,所以
比如 #define MUL(__x__, __y__) __x__ * __y__

int a = MUL(a + b, c+ d);
會被替換成 int a = a + b * c + d // 可能就會和初衷違背(如果你想做的是 (a + b) * (c + b))

從展開的角度來說 因為宏是可以嵌套的 所以宏在替換的時候 我們叫做展開

比如 做一個函數參數聲明
#define PARAMS_SET_1(__type__, __name__) __type__ __name__
#define PARAMS_SET_2(__type__, __name__) __type__ __name__##1, __type__ __name__##2

//... 定義N個 PARAMS_SET_N
#define PARAMS(__size__, __type__, __name__) PARAMS_SET_##__size__(__type__, __name__)

然後 定義函數

int foo(PARAMS(2, int, n));
那麼預編譯的時候宏會這樣展開

1, int foo(PARAMS_SET_2(int, n));
2, int foo(int n1, int n2);

另外注意就是編程的時候 由於宏只是文本替換,缺少類型檢測 以及運算順序這樣的功能,所以要少用宏

上面所有的宏都有替換的方案
#define M 1 替換方案
struct M
{enum {value = 1} };
int a = M::value;

#define MUL(__x__, __y__) __x__ * __y__ 替換方案
template<int x, int y>
struct MUL
{enum{value = x * y}};

int a = MUL<10 + 20, 10 + 30>::value;

最後一個PARAMS的替換方案就是函數重載
template<typename T>
int foo(T n1);

template<typename T>
int foo(T n1, Tn2);

//後面定義N個

6. 什麼是宏開關

通常這樣的宏叫做宏開關,有很多用處
1.譬如:
注釋掉一大段代碼,把這段代碼用
#if 0 //也可以用#ifdef NONONO,這里的NONONO是隨意的,只要沒有define過就行,但是#if 0更方便
這里是一大段代碼 //這段代碼編譯的時候就編譯不到了
#endif

2.再如:
通常用在頭文件中
假如頭文件myheader.h

會這樣寫這個文件

#ifndef __MYHEADER_H__ //注意,是ifndef,表示"假如沒有定義",這里的__MYHEADER_H__是任意定的,但通常會使用這樣的頭文件名的大寫字母形式,因為這樣可以保證這個宏的名字是唯一的
#define __MYHEADER_H__

void func(void){}

#endif /*__MYHEADER_H__*/ //加上這個注釋是比較好的習慣,有始有終,方便閱讀

7. c語言中怎麼用命令提示窗口編譯宏定義並列印出來!請指教.謝謝了.

安裝 Visual Studio 後在開始菜單里找 Microsoft Visual C++ 命令提示符,打開後,用微軟的編譯器 cl 編譯,不是 cpp。

8. 製作的宏啟用時提示編譯錯誤

ActiveSheet.Pictures , Insert
這里應該不是逗號,應該是點。
ActiveSheet.Pictures.Insert

9. c語言,說宏展開是在編譯時進行的,啥意思啥叫編譯時進行的

c語言編寫出來的代碼叫源代碼,是供人看的,如果想讓機器執行,需要轉換成機器語言,這個轉換過程就叫編譯。
在c語言中定義的宏,在編譯時,會展開(或叫替換)為實際的語句,如:
#define MAX 100
void main()
{
int a=MAX ;
printf("a=%d\n", a );
}
這里MAX是個宏,當編譯時,這段代碼就會變成:
void main()
{
int a=100; //這里的MAX會變成100
printf("a=%d\n", a );
}
這就是宏展開、宏替換,然後編譯器,按這樣子的源代碼進行編譯,生成執行程序

10. 如何在VC中編譯代碼時,通過傳入宏開關值得到不同的軟體版本

工程的選項中加入你的開關
然後再代碼中
#ifdef XXX
#endif

閱讀全文

與宏編譯開關相關的資料

熱點內容
listsortjava 瀏覽:180
plc閃光電路編程實例 瀏覽:297
socket編程試題 瀏覽:201
華為的伺服器怎麼設置從光碟機啟動 瀏覽:867
程序員真的累嗎 瀏覽:323
學信網app為什麼刷臉不了 瀏覽:871
天蠍vs程序員 瀏覽:991
單片機下載口叫什麼 瀏覽:186
程序員的道 瀏覽:924
雲伺服器不實名違法嗎 瀏覽:556
怎樣查看文件夾圖片是否重復 瀏覽:993
文件怎麼導成pdf文件 瀏覽:806
打開sql表的命令 瀏覽:101
安卓手機如何面部支付 瀏覽:37
天元數學app為什麼登錄不上去 瀏覽:823
明日之後為什麼有些伺服器是四個字 瀏覽:104
安卓系統l1是什麼意思 瀏覽:25
伺服器一直崩應該用什麼指令 瀏覽:924
cm202貼片機編程 瀏覽:729
php構造函數帶參數 瀏覽:179