宏編譯開關
A. EXCEl宏運行編譯錯誤是怎麼回事
這是隱藏程序的VBA代碼執行出錯。解決方法:
1)在Excel中按 Alt+F11 打開宏編輯器;
2)在宏編輯器中按 Ctrl+R 打開 工程資源管理面板(如果已打開,按 Ctrl+R 後不會有任何變化);
3)在工程資源管理面板中找到你的那個文件,點開,檢查是否存在「模塊n」(n為1、2……),在這些模塊上逐個點右鍵,「移除模塊n」。
4)最後保存,即可。
B. 什麼是宏開關
通常這樣的宏叫做宏開關,有很多用處
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__*/ //加上這個注釋是比較好的習慣,有始有終,方便閱讀
C. #if 及宏定義,是不是c語言里常有這種「開關」用法
#if確實是起到了一個開關作用,但是不同於if語句,if語句只是執行流的變化,最終代碼還是被編譯了,用#if的話,只有後面為真的情況下才編譯,你上面的定義後面需要跟數字,比如
#define USE_Port_B 0
那麼相應的代碼就不會被編譯,說一個簡單的情況
#if WINDOWS
//code
#endif
比方說你檢查系統的時候,如果是windows的話就定義宏WINDOWS,就是說只有在windows下才會編譯code部分
54文人網
D. 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
}
這種主要用在頭文件中,防止頭文件的重復調用。
E. c語言中怎麼用命令提示窗口編譯宏定義並列印出來!請指教.謝謝了.
安裝 Visual Studio 後在開始菜單里找 Microsoft Visual C++ 命令提示符,打開後,用微軟的編譯器 cl 編譯,不是 cpp。
F. 製作的宏啟用時提示編譯錯誤
ActiveSheet.Pictures , Insert
這里應該不是逗號,應該是點。
ActiveSheet.Pictures.Insert
G. 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 );
}
這就是宏展開、宏替換,然後編譯器,按這樣子的源代碼進行編譯,生成執行程序
H. 如何在VC中編譯代碼時,通過傳入宏開關值得到不同的軟體版本
工程的選項中加入你的開關
然後再代碼中
#ifdef XXX
#endif
I. 怎麼利用宏定義,分別編譯Debug版和Release版
乘,卜式未必窮一經。還須黑頭
J. 宏替換,宏展開到底分別在什麼時候進行
//在宏 使用的時候 分為
宏定義 和 宏展開, 你那個 宏替換就是展開
宏定義是你自己寫的 #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個