programing

MS Visual C++에서 VLA(Variable Length Array) 활성화?

newstyles 2023. 9. 16. 08:43

MS Visual C++에서 VLA(Variable Length Array) 활성화?

어떻게 하면 MS Visual C++에서 C99에 정의된 가변 길이 배열인 VLA를 사용할 수 있습니까? 아니면 전혀 사용할 수 없습니다.

예, C++ 표준이 C89를 기반으로 하고 있고 VLA는 C89 표준에서 사용할 수 없기 때문에 C++에서는 사용할 수 없다는 것을 알고 있지만 MSVC++는 /TC 컴파일러 매개 변수를 사용하여 켤 수 있는 동작인 C 컴파일러여야 합니다.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' : 알 수 없는 크기

MSVC는 C99 컴파일러가 아니며 가변 길이 배열을 지원하지 않습니다.

https://learn.microsoft.com/en-us/cpp/c-language/ansi-conformance 에서 MSVC는 C90을 준수하는 것으로 문서화되어 있습니다.

VLA는 쓰기에 훨씬 더 빠르지만 다음을 사용하여 유사한 동작을 얻을 수 있습니다.alloca()동적 메모리 할당 시std::vector엄두가 나지 않습니다.

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;
}

동일한 문제가 발생했습니다. MS Visual C++ 2015에서는 불가능합니다. 대신 벡터를 사용하여 거의 동일한 작업을 수행할 수 있습니다. 차이점은 힙 리소스 관리 루틴(new/delete)의 무시할 수 있는 오버헤드입니다.

VLA가 편리하긴 하지만 스택 오버플로의 위험이 있는 스택에서 결정적이지 않은 양의 메모리를 할당하는 것은 일반적으로 좋은 생각이 아닙니다.

MSVC 2015는 C99를 지원하지 않습니다.대신 동적 메모리 할당을 사용하여 이 논리를 사용합니다.

#include <stdlib.h>

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

    /* do something useful with pc */
    
    free(pc);
    return EXIT_SUCCESS;
}

예제를 사용하여 c++를 사용하여 가변 길이 배열을 만들려면 다음과 같은 작업을 수행합니다.

size_t size = argc + 5;
vector<char> pc(size);

std:string으로 변환하려면:

string buffer(pc.begin(), pc.end());

언급URL : https://stackoverflow.com/questions/5246900/enabling-vlas-variable-length-arrays-in-ms-visual-c