2011-12-08 33 views
3

我想在MSVC編譯器中禁用語言擴展,但僅限於特定的代碼塊。爲特定的代碼塊禁用語言擴展?

有一個compiler option可以配置爲禁用整個翻譯單元的語言擴展(例如,整個文件),但我不想這樣做。我最終想要啓用語言擴展當我編譯#include語句和其他預處理器的東西,但禁用它爲我的實際代碼。

有沒有辦法禁用特定代碼塊的語言擴展,或在MSVC 2008中使用#pragma

+2

它必須是#pragma。沒有人,我懷疑你正在尋找#pragma conform。沒有可以做的。 –

回答

1

它應該是不可能的,因爲當啓用語言擴展時,Visual Studio使用不同的算法來編譯代碼,這是在預處理器擴展之後發生的。換句話說,不可能使用擴展名編譯一半文件,而另一個則不能。

讓我用一個使用Variable-Length Argument Lists擴展的例子來說明。如果有什麼功能被定義爲在頭文件之一以下:

void myfunc(int x, ...); 
void myfunc(int x, char * c) 
{ } 

在源文件以後你叫

char * c = new char; 
myfunc(5, c); 

根據ANSI C頭文件中的聲明沒有任何意義可言因此應該調用帶有「...」的myfunc,而根據MSVS應該使用第二個函數。

+0

有趣,謝謝! –

+0

vararg如何擴展功能?即使K&R「你好,世界」使用它:'printf(const char *,...)' – MSalters

+0

@MSalters:重載vararg是一個擴展,而不是vararg本身。這是一種可變化的專業化(就像在模板中)。 –