當前位置:首頁 » 編程軟體 » 宏編譯開關

宏編譯開關

發布時間: 2022-01-11 04:19:10

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個

熱點內容
循跡小車演算法 發布:2024-12-22 22:28:41 瀏覽:82
scss一次編譯一直生成隨機數 發布:2024-12-22 22:04:24 瀏覽:956
嫁接睫毛加密 發布:2024-12-22 21:50:12 瀏覽:975
linuxbin文件的安裝 發布:2024-12-22 21:46:07 瀏覽:798
vlcforandroid下載 發布:2024-12-22 21:45:26 瀏覽:664
電腦做網關把數據發送至伺服器 發布:2024-12-22 21:44:50 瀏覽:431
新華三代理什麼牌子的伺服器 發布:2024-12-22 21:33:21 瀏覽:342
歡太會員密碼是什麼 發布:2024-12-22 20:57:28 瀏覽:74
sqllocaldb 發布:2024-12-22 20:07:08 瀏覽:126
如何找到我的伺服器 發布:2024-12-22 19:52:14 瀏覽:301