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
'programing' 카테고리의 다른 글
MySQL에서 기본 키가 아닌 필드를 자동으로 증가시켜야 합니다. (0) | 2023.09.16 |
---|---|
j효과 추가를 사용한 jQuery (0) | 2023.09.16 |
안드로이드 프로젝트에서 사용하지 않는 문자열을 쉽게 찾을 수 있는 방법이 있습니까? (0) | 2023.09.16 |
Swift Xcode 인덱스 동결 또는 느려짐 (0) | 2023.09.16 |
ASP에서 대용량 파일을 전달하는 방법NET 응답? (0) | 2023.09.16 |