我想在MSVC編譯器中禁用語言擴展,但僅限於特定的代碼塊。爲特定的代碼塊禁用語言擴展?
有一個compiler option可以配置爲禁用整個翻譯單元的語言擴展(例如,整個文件),但我不想這樣做。我最終想要啓用語言擴展當我編譯#include
語句和其他預處理器的東西,但禁用它爲我的實際代碼。
有沒有辦法禁用特定代碼塊的語言擴展,或在MSVC 2008中使用#pragma
?
我想在MSVC編譯器中禁用語言擴展,但僅限於特定的代碼塊。爲特定的代碼塊禁用語言擴展?
有一個compiler option可以配置爲禁用整個翻譯單元的語言擴展(例如,整個文件),但我不想這樣做。我最終想要啓用語言擴展當我編譯#include
語句和其他預處理器的東西,但禁用它爲我的實際代碼。
有沒有辦法禁用特定代碼塊的語言擴展,或在MSVC 2008中使用#pragma
?
它應該是不可能的,因爲當啓用語言擴展時,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應該使用第二個函數。
有趣,謝謝! –
vararg如何擴展功能?即使K&R「你好,世界」使用它:'printf(const char *,...)' – MSalters
@MSalters:重載vararg是一個擴展,而不是vararg本身。這是一種可變化的專業化(就像在模板中)。 –
它必須是#pragma。沒有人,我懷疑你正在尋找#pragma conform。沒有可以做的。 –