A. vs中debug和release版本的區別
vs中的程序有debug和release兩個版本。
1、版本不同
Debug通常稱為調試版本,通過一系列編譯選項的配合,編譯的結果通常包含調試信息,而且不做任何優化,以為開發人員提供強大的應用程序調試能力。
而Release通常稱為發布版本,是為用戶使用的,一般客戶不允許在發布版本上進行調試。
2、運行效果不同
debug程序通常比release程序要慢,尤其是處理視頻方便release要比debug快很多。
3、演算法不同
debug跟release在初始化變數時所做的操作是不同的,debug是將每個位元組位都賦成0xcc, 而release的賦值近似於隨機。
(1)條件編譯開關圖片大全擴展閱讀:
二者的編譯選項。
Debug 版本:
/Od 關閉優化開關
/D "_DEBUG" 相當於 #define _DEBUG,打開編譯調試代碼開關(主要針對assert函數)
/ZI 創建 Edit and continue(編輯繼續)資料庫,這樣在調試過程中如果修改了源代碼不需重新編譯
/GZ 可以幫助捕獲內存錯誤
/Gm 打開最小化重鏈接開關,減少鏈接時間
Release 版本:
/MD /ML 或 /MT 使用發布版本的運行時刻函數庫
/O1 或 /O2 優化開關,使程序 最小或最快
/D "NDEBUG" 關閉條件編譯調試代碼開關(即不編譯assert函數)
/GF 合並重復的字元串,並將字元串常量放到只讀內存,防止被修改
可以理解Debug 和 Release 並沒有本質的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。可以修改這些選項,從而得到優化過的調試版本或是帶跟蹤語句的發布版本。
B. C++中這個條件編譯哪裡用錯了
這種情況下也用條件編譯?
條件編譯——根據指定的條件有選擇的編譯代碼塊的相應部分
#if a>=65&&a<=90
a+=32;
cout<<"轉換成小寫字母為:"<<a<<"."<<endl;
#else
a-=32;
cout<<"轉換成大寫字母為:"<<a<<"."<<endl;
#endif
默認編譯的應該是:
a-=32;
cout<<"轉換成大寫字母為:"<<a<<"."<<endl;
程序運行的時候已經編譯好了,所以不論你輸入什麼字母都按編譯好的程序執行,也就是執行
a-=32;
cout<<"轉換成大寫字母為:"<<a<<"."<<endl;
明白?
----------------------------------
char a;
// cout<<"請輸入一個字母:"<<endl;
// cin>>a;
bool bl = (a>=65&&a<=90);
cout<<"\t------"<<a<<"="<<(int)a<<"---"<<bl<<"---"<<endl;
編譯的時候a還沒有值,我用VC6.0編譯運行的結果是?,asc碼值=56,也就是bl(上面的條件編譯標識)為FALSE,當然執行後面的了
當然編譯器不同,編譯運行的結果也不同,有很大的不確定性,這也是條件編譯開關很少用變數的原因。
C. C++中的條件編譯是怎麼一回事能舉例解釋一下嗎
一般情況下,源程序中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是「條件編譯」。有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。
條件編譯命令最常見的形式為:
#ifdef 標識符
程序段1
#else
程序段2
#endif
它的作用是:當標識符已經被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。
其中#else部分也可以沒有,即:
#ifdef
程序段1
#denif
這里的「程序段」可以是語句組,也可以是命令行。這種條件編譯可以提高C源程序的通用性。如果一個C源程序在不同計算機系統上運行,而不同的計算機又有一定的差異。例如,我們有一個數據類型,在Windows平台中,應該使用long類型表示,而在其他平台應該使用float表示,這樣往往需要對源程序作必要的修改,這就降低了程序的通用性。可以用以下的條件編譯:
#ifdef WINDOWS
#define MYTYPE long
#else
#define MYTYPE float
#endif
如果在Windows上編譯程序,則可以在程序的開始加上
#define WINDOWS
這樣則編譯下面的命令行:
#define MYTYPE long
如果在這組條件編譯命令之前曾出現以下命令行:
#define WINDOW
則預編譯後程序中的MYTYPE都用float代替。這樣,源程序可以不必作任何修改就可以用於不同類型的計算機系統。當然以上介紹的只是一種簡單的情況,可以根據此思路設計出其它的條件編譯。
例如,在調試程序時,常常希望輸出一些所需的信息,而在調試完成後不再輸出這些信息。可以在源程序中插入以下的條件編譯段:
#ifdef DEBUG
print ("device_open(%p)\n", file);
#endif
如果在它的前面有以下命令行:
#define DEBUG
則在程序運行時輸出file指針的值,以便調試分析。調試完成後只需將這個define命令行刪除即可。有人可能覺得不用條件編譯也可達此目的,即在調試時加一批printf語句,調試後一一將printf語句刪除去。的確,這是可以的。但是,當調試時加的printf語句比較多時,修改的工作量是很大的。用條件編譯,則不必一一刪改printf語句,只需刪除前面的一條「#define DEBUG」命令即可,這時所有的用DEBUG作標識符的條件編譯段都使其中的printf語句不起作用,即起統一控制的作用,如同一個「開關」一樣。
有時也採用下面的形式:
#ifndef 標識符
程序段1
#else
程序段2
#endif
只是第一行與第一種形式不同:將「ifdef」改為「ifndef」。它的作用是:若標識符未被定義則編譯程序段1,否則編譯程序段2。這種形式與第一種形式的作用相反。
以上兩種形式用法差不多,根據需要任選一種,視方便而定。
還有一種形式,就是#if後面的是一個表達式,而不是一個簡單的標識符:
#if 表達式
程序段1
#else
程序段2
#endif
它的作用是:當指定的表達式值為真(非零)時就編譯程序段1,否則編譯程序段2。可以事先給定一定條件,使程序在不同的條件下執行不同的功能。
例如:輸入一行字母字元,根據需要設置條件編譯,使之能將字母全改為大寫輸出,或全改為小寫字母輸出。
#define LETTER 1
main()
{
char str[20]="C Language",c;
int i=0;
while((c=str[i])!='\0'){
i++;
#if LETTER
if(c>='a'&&c<='z') c=c-32;
#else
if(c>='A'&&c<='Z') c=c+32;
#endif
printf("%c",c);
}
}
運行結果為:C LANGUAGE
現在先定義LETTER為1,這樣在預處理條件編譯命令時,由於LETTER為真(非零),則對第一個if語句進行編譯,運行時使小寫字母變大寫。如果將程序第一行改為:
#define LETTER 0
則在預處理時,對第二個if語句進行編譯處理,使大寫字母變成小寫字母(大寫字母與相應的小寫字母的ASCII代碼差32)。此時運行情況為:
c language
有人會問:不用條件編譯命令而直接用if語句也能達到要求,用條件編譯命令有什麼好處呢?的確,此問題完全可以不用條件編譯處理,但那樣做目標程序長(因為所有語句都編譯),而採用條件編譯,可以減少被編譯的語句,從而減少目標的長度。當條件編譯段比較多時,目標程序長度可以大大減少。
補充:
頭文件中的#ifndef
千萬不要忽略了頭件的中的#ifndef,這是一個很關鍵的東西。比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明沖突。
還是把頭文件的內容都放在#ifndef和#endif中吧。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:
#ifndef <標識>
#define <標識>
......
......
#endif
<標識>在理論上來說可以是自由命名的,但每個頭文件的這個「標識」都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的「.」也變成下劃線,如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif
D. debug和release兩種編譯方法的區別與聯系
Debug 為調試版本,Release 為發布版本,從開發者和用戶視角看,他們的區別如下:
一、從開發者視角,Debug和Release的區別,主要是編譯器的選項不同,Debug 包含調試信息,並且不作任何優化,便於程序員調試程序。Release 往往是進行了各種優化,使得程序在代碼大小和運行速度上都是最優的,以便用戶很好地使用。
Debug 版本 相關參數解釋:
參數 含義
/MDd /MLd 或 /MTd 使用 Debug runtime library(調試版本的運行時刻函數庫)
/Od 關閉優化開關
/D "_DEBUG" 相當於 #define _DEBUG,打開編譯調試代碼開關(主要針對assert函數)
/ZI
創建 Edit and continue(編輯繼續)資料庫,這樣在調試過程中如果修改了源代碼不需重新編譯
GZ 可以幫助捕獲內存錯誤
Release 版本 參數含義
/MD /ML 或 /MT 使用發布版本的運行時刻函數庫
/O1 或 /O2 優化開關,使程序最小或最快
/D "NDEBUG" 關閉條件編譯調試代碼開關(即不編譯assert函數)
/GF 合並重復的字元串,並將字元串常量放到只讀內存,防止被修改
二、使用者視角,我們下載軟體的時候,一般應該選擇Release版。Debug一般比測試版更粗,主要提供給高級測試者反饋修改意見。
E. l1l2l3開關怎麼接圖片
l1l2l3開關接線方法如下:
1、單聯雙控開關接線圖
該接線圖為兩個一開雙控開關同時控制一盞燈的亮與滅,兩個開關控制一盞燈運用比較廣泛,如樓道、卧室等。備註:示意圖中「L、L1、L2」與其他產品中「com、com1、com2」對應,為同一介面。
F. define的用法
有三種用法,例如替代多行的代碼、條件編譯,還有典型的宏定義,具體如下:
1、define最重要的用法是條件編譯
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif
可以在編譯的時候通過#define設置編譯環境
2、典型的使用方法
使用宏定義我們可以自己根據自己的習慣來定義甚至改變C語言的語法習慣,例如:
#defineBEGIN {
#defineEND }
int main()BEGIN
printf ("DEFINE---- ");
定義一個循環
#define LOOP for(;;)
重新定義數據類型
#define IT int
3、define可以替代多行的代碼,在每一個換行的時候加上一個""
#define MAX(X,Y) do {
語句1;
語句2;
/* 注釋的寫法 */
} while(0) /* (no trailing ; ) */
(6)條件編譯開關圖片大全擴展閱讀:
參數
#define GPEBLT_FUNCNAME(basename) (SCODE (GPE::*)(struct GPEBltParms *))&GPE::##basename
在#define中,標准只定義了#和##兩種操作。#用來把參數轉換成字元串,##則用來連接前後兩個參數,把它們變成一個字元串。
#include<stdio.h>
#definepaster(n)printf("token"#n"=%d ",token##n)
intmain(void)
{
inttoken9=10;
paster(9);
return0;
}
輸出為:token 9 = 10
G. 單片機編程:#define FOSC 1843200L是什麼意思#define是怎麼用的
#define 在c語言中經常用到,還有類似的typedef,下面是詳細的用法和說明,用好了可以節省很多函數!!
1.簡單的define定義
#define MAXTIME 1000
一個簡單的MAXTIME就定義好了,它代表1000,如果在程序裡面寫
if(i<MAXTIME){.........}
編譯器在處理這個代碼之前會對MAXTIME進行處理替換為1000。
這樣的定義看起來類似於普通的常量定義CONST,但也有著不同,因為define的定義更像是簡單的文本替換,而不是作為一個量來使用,這個問題在下面反映的尤為突出。
2.define的「函數定義」
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.宏的單行定義
#define A(x) T_##x
#define B(x) #@x
#define C(x) #x
我們假設:x=1,則有:
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"
(這里參考了 hustli的文章)
3.define的多行定義
define可以替代多行的代碼,例如MFC中的宏定義(非常的經典,雖然讓人看了惡心)
#define MACRO(arg1, arg2) do { \
/* declarations */ \
stmt1; \
stmt2; \
/* ... */ \
} while(0) /* (no trailing ; ) */
關鍵是要在每一個換行的時候加上一個"\
修補了幾個bug
4.在大規模的開發過程中,特別是跨平台和系統的軟體里,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 XXX…(#else) …#endif
例如 #ifdef DV22_AUX_INPUT
#define AUX_MODE 3
#else
#define AUY_MODE 3
#endif
#ifndef XXX … (#else) … #endif
7.頭文件(.h)可以被頭文件或C文件包含;
重復包含(重復定義)
由於頭文件包含可以嵌套,那麼C文件就有可能包含多次同一個頭文件,就可能出現重復定義的問題的。
通過條件編譯開關來避免重復包含(重復定義)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__
…
文件內容
…
#endif
#define和typedef的區別
1) #define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程序時才會發現可能的錯誤並報錯。例如:
#define PI 3.1415926
程序中的:area=PI*r*r 會替換為3.1415926*r*r
如果你把#define語句中的數字9 寫成字母g 預處理也照樣帶入。
2)typedef是在編譯時處理的。它在自己的作用域內給一個已經存在的類型一個別名,但是You cannot use the typedef specifier inside a function definition。
3)typedef int * int_ptr;
與
#define int_ptr int *
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說 ,#define在預處理 時進行簡單的替換,而typedef不是簡單替換 ,而是採用如同定義變數的方法那樣來聲明一種類型。也就是說;
//refer to (xzgyb(老達摩))
#define int_ptr int *
int_ptr a, b; //相當於int * a, b; 只是簡單的宏替換
typedef int* int_ptr;
int_ptr a, b; //a, b 都為指向int的指針,typedef為int* 引入了一個新的助記符
這也說明了為什麼下面觀點成立
//QunKangLi(維護成本與程序員的創造力的平方成正比)
typedef int * pint ;
#define PINT int *
那麼:
const pint p ;//p不可更改,但p指向的內容可更改
const PINT p ;//p可更改,但是p指向的內容不可更改。
pint是一種指針類型 const pint p 就是把指針給鎖住了 p不可更改
而const PINT p 是const int * p 鎖的是指針p所指的對象。
3)也許您已經注意到#define 不是語句 不要在行末加分號,否則 會連分號一塊置換。
H. C++裡面什麼是"非零值"
這個問題我幾天前有遇到,我印象中老點編譯器是可以 編過的,當成a值為0。
然而我手上最老的是vs2005,試了,編不過,所以印象也許不準確。
根據C++標准,#if後面跟的必須是一個常量表達式。
1)如下的可以編過,且a被當成0, 這是因為微軟的MSDN裡面,錯誤C1017的描述中有「In other cases, the preprocessor evaluates an undefined constant as zero. 」,即「未定義的常量被預處理器計算成0」, 所以a已經成為常量0了:
//#define a
#if a
...
#endif
2) 上面的代碼去掉define行的注釋就變成你的情況了,這時候,a被定義了,不是一個未定義的,所以無法計算成0了,你只需要#define a 1就可以了, 這個1此處不能省掉。
3) 根據你的要求,你需要的是測試a到底定義沒,那麼推薦用"#ifdef a" "#ifndef a"這種。
4)如果堅持用#if,那麼defined(a) 可以通過識別 a是否被定義,而計算出一個常數1或者0
也就是:
#define a
#if defined(a)
...
#endif