Ответ 1
MSVC не является компилятором C99 и не поддерживает массивы переменной длины.
В https://docs.microsoft.com/en-us/cpp/c-language/ansi-conformance MSVC документирован как соответствующий C90.
Как я могу включить использование VLA, массивов переменной длины, как определено в C99, в MS Visual С++ или это вообще невозможно?
Да, я знаю, что стандарт С++ основан на C89 и что VLA недоступны в стандарте C89 и, следовательно, недоступны на С++, но MSVС++ также должен быть компилятором C, поведение, которое может быть переключено при использовании параметра компилятора /TC (Compile as C Code (/TC)
). Но, похоже, это не означает, что VLA и процесс компиляции терпят неудачу с теми же ошибками при построении как С++ (Compile as C++ Code (/TP)
). Может быть, компилятор MSVС++ 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://docs.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;
}