VC編譯器設定

2021-04-12 12:09:02 字數 4852 閱讀 4252

工欲善其事,必先利其器;要想用

vc開發出高效率程式,必須對

vc編譯器有充分的了解。如果我們已經習慣編譯器給我的預設設定,那麼現在起開始嘗試改變吧

!本篇文章(或者後續文章)講解

vc編譯器設定選項並沒有先後順序,只是作者在具體開發過程碰見了不同的編譯設定,進行深入了解,做此文章記錄。也希望讀到這篇文章的您有所收穫;本文章主要參考

msdn

,編譯器為

vc7.1

,作者只是新增一些通俗例子,或者翻譯部分英文內容,從而達到對編譯器設定的通俗理解。

1:/gr(啟用執行時型別資訊)

說明:此選項 (/gr) 新增**以便在執行時檢查物件型別。當指定此選項時,編譯器定義 _cpprtti預處理器巨集。預設情況下,此選項被清除 (/gr–)。

在 visual studio 開發環境中設定此編譯器選項

開啟此專案的「屬性頁」對話方塊。

單擊「c/c++」資料夾。

單擊「語言」屬性頁。

修改「啟用執行時型別資訊」屬性。

例子:我們使用typeid,在執行時刻獲的變數的型別

// expre_typeid_operator.cpp

// compile with: /gr /ehsc

#include

#include

class base

};class derived : public base {};

using namespace std;

int main()

2:/eh(異常處理模型)

/eh[c][-]

此選項指定編譯器使用的異常處理模型。

/ehc

選項要求指定 /ehs、/eha 或 /gx。它通知編譯器假定externc 函式從不引發異常。

該選項可以用符號 - 清除。例如,/ehsc- 解釋為 /ehs /ehc-,並且等效於 /ehs。

在 visual studio 開發環境中設定此編譯器選項

開啟此專案的「屬性頁」對話方塊。

單擊「c/c++」資料夾。

單擊「**生成」屬性頁。

修改「啟用 c++ 異常」屬性。

或者

單擊「c/c++」資料夾。

單擊「**生成」屬性頁。

將「啟用 c++ 異常」設定為「否」。

單擊「命令列」屬性頁。

在「附加選項」框中鍵入編譯器選項。

/zc(一致性)

/zc 編譯器選項使您可以用 /ze指定標準行為。以下是 /zc 編譯器選項列表:

/zc:forscope

/zc:wchar_t

(1):/zc:forscope(強制 for 迴圈範圍中的一致性)

ms標準行為是使for迴圈的初始值設定項在for迴圈之後超出範圍。在 /ze下,for迴圈的初始值設定項保持在範圍內,直到區域性範圍結束。

可以用 conform 雜注修改 /zc:forscope 的執行時行為。

如果在具有現有 .pch 檔案的專案中使用 /zc:forscope,則忽略 /zc:forscope(伴有警告),並繼續用現有的 .pch 檔案編譯。如果需要生成新的 .pch 檔案,請使用 /yc。

在 visual studio 開發環境中設定此編譯器選項

開啟此專案的「屬性頁」對話方塊。

單擊「c/c++」資料夾。

單擊「語言」屬性頁。

修改「強制 for 迴圈範圍中的一致性」屬性。

例子說明:

下列**將在 /ze 下編譯,但不在 /za 下編譯:

int main()
}
使用 /zc:forscope 時,如果變數因為存在乙個在以前的範圍內所做的宣告而處在範圍內,則將得到警告。為了說明這點,請移除上面**中的//字元以宣告int i

2

)/zc:wchar_t

(wchar_t

是本機型別)

如果未指定 /zc:wchar_t,則編譯器要求您或者定義wchar_t,或者包括定義wchar_t的眾多標頭檔案中的乙個檔案(例如 wchar.h)。wchar_t通常定義為unsigned short

在指定 /zc:wchar_t 編譯器選項時,型別wchar_t成為對映到__wchar_t的本機型別,其對映方式與short對映到__int16相同。

如果使用 /zc:wchar_t,編譯器將wchar_t識別為本機型別。有關wchar_t的更多資訊,請參見資料型別範圍。

__wchar_t始終可用。

通過同時為 wchar_t 的無符號短格式和 __wchar_t 變體提供過載,您可以建立能夠輕鬆通過用(或未用)/zc:wchar_t 編譯的**鏈結的庫,並且無需提供該庫的兩個不同的版本(啟用和未啟用 /zc:wchar_t 的版本)。

指定 /zc:wchar_t 時,定義_wchar_t_defined_native_wchar_t_defined符號;有關更多資訊,請參見預定義巨集。

在 visual studio 開發環境中設定此編譯器選項

開啟此專案的「屬性頁」對話方塊。

單擊「c/c++」資料夾。

單擊「語言」屬性頁。

修改「將 wchar_t 視為內建型別」屬性。

例子說明:

/ob(內聯函式展開)

/ob 「

內聯函式展開」(/obn)選項控制函式的內聯展開,其中 n 是下列之一:

選項

說明

/ob0

禁用內聯展開(預設情況下是開啟的)。

/ob1

只展開標記為 inline 或__inline的函式,或在類宣告內定義的 c++ 成員函式中的函式。

/ob2

展開標記為inline__inline的函式和編譯器選擇的任何其他函式(由編譯器自行進行展開,通常稱作自動內聯)。 此選項要求使用 /o1、/o2、/ox 或 /og 啟用優化。

編譯器將內聯展開選項和關鍵字視為建議。不保證函式將內聯展開。無法強制編譯器內聯特定函式。

還可以使用 #pragma auto_inline 將某些函式排除在作為內聯展開的候選函式而加以考慮的函式之外。另見 #pragma intrinsic。

在 visual studio 開發環境中設定此編譯器選項

開啟此專案的「屬性頁」對話方塊。

單擊「c/c++」資料夾。

單擊「優化」屬性頁。

修改「內聯函式展開」屬性。

例子說明:1:

class a

;//

隱含inline模式

void fun()// 隱含inline模式}

如上面的函式,在類或者結構體內定義的函式,將自動設定為inline模式

ms還有乙個關鍵字__forceinline(強制inline),使用這個關鍵字後,如果函式沒有被__forceinline將會產成一級警告(警告號是4714)

函式或者編譯器設定屬於下面的情況,使用inline,__inline,__forceinline將失效。 1

:內聯模式(/ob0)關閉的(debug模式下預設設定) 2

:函式和呼叫者使用不同異常型別的。 3

:可變引數函式 4

:函式使用inline關鍵字,但是沒有使用編譯設定/og(全域性優化), /ox(完全優化), /o1(最小化大小), or /o2(最小化速度). 5

:函式使用inline關鍵字,編譯選項沒有設定返回值檢查異常型別,編譯選項為/gx(啟用異常處理

), /ehs, or /eha(它通知編譯器假定externc 函式從不引發異常 )

6:函式接受存在異常型別的拷貝構造物件,但是開啟為/gx(啟用異常處理

), /ehs, or /eha(它通知編譯器假定externc 函式從不引發異常 )

7:函式是乙個迴圈體並且沒有使用#pragma inline_recursion(on)指定的。(使用pragma選項,迴圈體函式將inline,迴圈體內執行迴圈次數是8次,可以通過inline_depth設定) 8

:函式是虛函式,或者被虛函式呼叫。(直接呼叫虛函式被inline) 9

10:函式呼叫約定為

naked __declspec.

VC編譯器設定

工欲善其事,必先利其器 要想用 vc開發出高效率程式,必須對 vc編譯器有充分的了解。如果我們已經習慣編譯器給我的預設設定,那麼現在起開始嘗試改變吧 本篇文章 或者後續文章 講解 vc編譯器設定選項並沒有先後順序,只是作者在具體開發過程碰見了不同的編譯設定,進行深入了解,做此文章記錄。也希望讀到這篇...

VC編譯器設定 GR, EH, Zc, Ob

vc編譯器設定 工欲善其事,必先利其器 要想用 vc開發出高效率程式,必須對 vc編譯器有充分的了解。如果我們已經習慣編譯器給我的預設設定,那麼現在起開始嘗試改變吧 本篇文章 或者後續文章 講解 vc編譯器設定選項並沒有先後順序,只是作者在具體開發過程碰見了不同的編譯設定,進行深入了解,做此文章記錄...

vc 編譯器環境變數設定

在cmd中使用vc編譯器需要設定三個環境變數 1 系統環境變數path加入 編譯器路路徑 bin 2 加入include環境變數 編譯器路徑 include 3 加入lib環境變數 編譯器路徑 lib 比如我的vc編譯器放在e developtool vc2010 path應加入e developt...