2011-03-09 34 views
16

如何在MS Visual C++中啓用使用VLA,C99中定義的可變長度數組或者根本不可能?在MS Visual C++中啓用VLAs(可變長度數組)?

是的,我知道C++標準是基於C89,並且在C89標準中沒有可用的VLA,因此在C++中不可用,但MSVC++也應該是C編譯器,也可以是使用/ TC編譯器參數(Compile as C Code (/TC))開啓。但是這樣做似乎並沒有啓用VLA,並且編譯過程在構建C++時(Compile as C++ Code (/TP))以相同的錯誤失敗。也許MSVC++ C編譯器只與C89兼容,或者我缺少一些東西(一些特殊的構造或編譯指示/定義)?

代碼示例:

#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
    char pc[argc+5]; 

    /* do something useful with pc */ 

    return EXIT_SUCCESS; 
} 

編譯錯誤:

錯誤C2057:預期常量表達式

錯誤C2466:不能分配恆定大小的數組0

錯誤C2133 :'pc':未知尺寸

回答

16

MSVC不是C99編譯器,不支持可變長度數組。

https://docs.microsoft.com/en-us/cpp/c-language/ansi-conformance MSVC記錄爲符合C90。

+2

不僅如此,它可能永遠不會:http://connect.microsoft.com/VisualStudio/feedback/details/333273/request-for-c99-vla-in-visual-studio太糟糕了。 – 2011-03-09 14:12:04

+0

然後解決爭端。 :-)是否有對啓用VLA的語言進行微軟擴展?海灣合作委員會有一個,從而使他們的C90和C++,除了C99合規。 http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html – Shinnok 2011-03-09 14:18:39

+0

我認爲John提供的鏈接表明沒有,也不會很快。 – 2011-03-09 14:19:45

4

VLA的寫法非常簡潔,但當std::vector的動態內存分配過高時,您可以使用alloca()獲得類似的行爲。

http://msdn.microsoft.com/en-us/library/x9sx5da1.aspx

使用alloca()在你的榜樣將給:

#include <stdlib.h> 
#include <alloca.h> 

int main(int argc, char **argv) 
{ 
    char* pc = (char*) alloca(sizeof(char) * (argc+5)); 

    /* do something useful with pc */ 

    return EXIT_SUCCESS; 
} 
+1

在較新版本的msvc中''alloca'和它的朋友'_alloca'都被棄用而支持'_malloca'。而且這個函數使用起來很麻煩,所以最好只聲明一個長度恆定的數組並使用它。 – 2018-01-21 00:22:20

1

我遇到了同樣的問題,這是不可能在微軟的Visual C++ 2015年,而不是你可以用向量做幾乎一樣,唯一的區別是堆資源管理例程(新建/刪除)可忽略的開銷。

儘管VLA很方便,但是從棧中分配具有堆棧溢出風險的非確定性內存量通常不是一個好主意。

+0

這不提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/18967986) – Agush 2018-03-01 07:16:38

+0

對不起,我剛剛從你給我的鏈接中學到了,Thx指出了! – 2018-03-02 00:37:49