2011-03-09 5 views
16

MS Visual C++에서 C99에 정의 된대로 VLA, 가변 길이 배열을 사용하도록 설정하려면 어떻게해야합니까? 아니면 전혀 사용할 수 없습니까?MS Visual C++에서 VLA (가변 길이 배열)를 사용 하시겠습니까?

예 C++ 표준은 C89를 기반으로하고 있으며 VLA는 C89 표준에서 사용할 수 없으므로 C++에서는 사용할 수 없다는 것을 알고 있지만 MSVC++는 C 컴파일러이기도합니다./TC 컴파일러 매개 변수 (Compile as C Code (/TC))를 사용하여 켜십시오. 하지만 이렇게하면 VLA를 사용할 수없는 것처럼 보이고 C++ (Compile as C++ Code (/TP))로 빌드 할 때 동일한 오류로 컴파일 프로세스가 실패합니다. 어쩌면 MSVC++ C 컴파일러는 C89 호환 또는 뭔가 (일부 특수 구문 또는 pragma/define) 누락되었습니다?

코드 샘플 :

#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 너무 좋지 않습니다. –

+0

그러면 분쟁이 해결됩니다. :-) VLA를 가능하게하는 언어에 대한 Microsoft의 확장 기능이 있습니까? GCC에는 C99 준수 외에도 C90 및 C++ 용으로 사용할 수있는 기능이 있습니다. http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html – Shinnok

+0

John이 제공 한 링크는 아직 존재하지 않으며 곧 제공 될 것 같지 않습니다. –

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'를 위해 더 이상 사용되지 않습니다. 그리고 그 함수는 사용하기에 너무 귀찮아서 일정한 길이의 배열을 선언하고 그것을 사용하는 것이 낫습니다. –

1

,이 MS 비주얼 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-can- i-do- 대신). - [리뷰에서] (리뷰/저품절 포스트/18967986) – Agush

+0

죄송합니다. 내게 알려준 링크를 통해 배웠습니다. Thx가 지적했습니다! –