VLA в C ++ с расширением std = c ++ 11 - PullRequest
0 голосов
/ 09 июля 2020

Как VLA работает в C ++, несмотря на наличие опции компиляции -std=c++11. Согласно G CC:

Автоматические массивы переменной длины c разрешены в ISO C99, а в качестве расширения G CC принимает их в режиме C90 и в C ++.

#include<iostream>

using namespace std;

int fun()
{
    int j;
    cin>>j;
    return j;
}

int main()
{
    const int i=fun();

    int j[i];
    return 0;
}

1 Ответ

2 голосов
/ 09 июля 2020

Как Джонатан упоминает в комментарии , g cc имеет параметр pedantic, который также запрещает расширения:

-Wpedantic

-pedantic

Выдавать все предупреждения, требуемые строгими стандартами ISO C и ISO C ++; отклонить все программы, использующие запрещенные расширения, а также некоторые другие программы, не соответствующие ISO C и ISO C ++. Для ISO C следует версии стандарта ISO C, заданной любым используемым параметром -std.

Действительные программы ISO C и ISO C ++ должны правильно компилироваться с этим параметром или без него (хотя в редких случаях требуется опция -ansi или -std с указанием требуемой версии ISO C). Однако без этой опции также поддерживаются некоторые расширения GNU и традиционные функции C и C ++. С этой опцией они отклоняются.

-Wpedantic не вызывает предупреждающих сообщений об использовании альтернативных ключевых слов, имена которых начинаются и заканчиваются на '__'. Этот альтернативный формат также можно использовать для отключения предупреждений для типов, отличных от ISO «__intN», например, «__intN__». Предупреждения Pedanti c также отключены в выражении, которое следует за __extension__. Однако только системные файлы заголовков должны использовать эти пути выхода; прикладные программы должны избегать их. См. Альтернативные ключевые слова.

Некоторые пользователи пытаются использовать -Wpedantic для проверки программ на строгое соответствие ISO C. Вскоре они обнаруживают, что он делает не совсем то, что им нужно: он обнаруживает некоторые методы, отличные от ISO, но не все - только те, для которых ISO C требует диагностики c, и некоторые другие, для которых была добавлена ​​диагностика.

Функция сообщения о любом несоответствии ISO C может быть полезной в некоторых случаях, но потребует значительных дополнительных усилий и будет сильно отличаться от -Wpedantic. У нас нет планов поддерживать такую ​​функцию в ближайшем будущем.

Где стандарт, указанный с помощью -std, представляет собой расширенный диалект GNU C, например 'gnu90' или 'gnu99 ', существует соответствующий базовый стандарт, версия ISO C, на которой основан расширенный диалект GNU. Предупреждения от -Wpedantic даются там, где они требуются базовым стандартом. (Не имеет смысла выдавать такие предупреждения только для функций, не относящихся к указанному диалекту GNU C, поскольку по определению диалекты GNU C включают все функции, поддерживаемые компилятором с данной опцией, и это будет не о чем предупреждать.)

-pedantic-errors

Выдает ошибку всякий раз, когда базовый стандарт (см. -Wpedantic) требует диагностики c, в некоторых случаях, когда есть неопределенное поведение в во время компиляции и в некоторых других случаях, которые не препятствуют компиляции программ, которые действительны в соответствии со стандартом. Это не эквивалентно -Werror=pedantic, так как есть ошибки, разрешенные этой опцией, но не разрешенные последней, и наоборот.

Я подчеркиваю выделенную часть - очевидно, некоторые вещи могут все же проскользнуть . Тем не менее, я нахожу этот вариант достаточным для своих нужд.

...