Ограничения структуры управления C / C ++? - PullRequest
3 голосов
/ 22 января 2010

Я слышал об ограничении в VC ++ (не знаю, какая версия) на количество вложенных операторов if (где-то в пределах 300). Код был в форме:

if (a) ...
else if (b) ...
else if (c) ...
...

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

Вот список вещей, которые я себе представляю может иметь некоторые ограничения:

  • Количество функций в области (глобальная, класс или пространство имен).
  • Количество выражений в одном выражении (например, составные условия).
  • Количество дел в выключателе.
  • Количество параметров для функции.
  • Количество классов в одной иерархии (наследование или ограничение).

Какие другие структуры управления / языковые функции имеют такие ограничения? Говорят ли языковые стандарты об этих пределах (возможно, минимальные требования для реализации)? Кто-нибудь сталкивался с определенным языковым ограничением, подобным этому, с конкретным компилятором / реализацией?

РЕДАКТИРОВАТЬ: Обратите внимание, что вышеприведенная форма if операторов действительно "вложенные". Это эквивалентно:

if (a) { //...
}
else {
    if (b) { //...
    }
    else {
        if (c) { //...
        }
        else { //...
        }
    }
}

Ответы [ 4 ]

11 голосов
/ 22 января 2010

Пределы компилятора Visual C ++

Стандарт C ++ рекомендует ограничения для различные языковые конструкции. Ниже приведен список конструкций где компилятор Visual C ++ не реализовать рекомендуемые ограничения. первое число является рекомендуемым пределом и второе число является пределом реализовано в Visual C ++:

  • Уровни вложенности составных операторов, структуры управления итерациями и выбор структуры управления [256] (256).

  • Параметры в одном макроопределении [256] (127).

  • Аргументы в одном вызове макроса [256] (127).

  • Символы в строке символов буквальный или широкий строковый литерал (после конкатенация) [65536] (65535).

  • Уровни вложенного класса, структуры или объединение определений в одном список объявляемых структур [256] (16).

  • Инициализаторы элементов в конструкторе определение [6144] (приблизительно 600, зависит от памяти, может увеличиваться с опция компилятора / Zm).

  • Область квалификаций одного идентификатора [256] (127).

  • Вложенные внешние спецификации [1024] (10).

  • Аргументы шаблона в шаблоне декларация [1024] (64).

6 голосов
/ 22 января 2010

Говорят ли языковые стандарты что-нибудь об этих пределах (возможно, минимальный требования к реализации)?

Нет, стандарт не устанавливает минимальных ограничений на это. Но хорошей практикой для реализации является установка и документирование жесткого ограничения на такие вещи, а не сбой каким-либо неизвестным способом при превышении лимита.

Редактировать: Стандарт рекомендует некоторые минимальные ограничения В Приложении B - их здесь слишком много, и они в любом случае рекомендательны:

Пределы могут ограничивать количество которые включают в себя те, которые описаны ниже или другие. Число в скобках после каждое количество рекомендуется в качестве минимум для этого количества. Тем не мение, эти величины являются лишь ориентировочными и не определить соответствие.

3 голосов
/ 22 января 2010

Просто чтобы уложить всю область видимости в постель, допустим следующий код C ++:

int main() {
    if ( int x = 1 ) {
    }
    else if ( int x = 2 ) {
    }
}

, чего бы не было, если бы и if, и else if находились в одной и той же области видимости. Я думаю, что было много недоразумений, возможно, порожденных моим комментарием:

The compiler cares a great deal about scope. 

что, конечно, верно, но, возможно, не поможет в этой ситуации.

3 голосов
/ 22 января 2010

C указывает, что реализации должны иметь возможность переводить программу, которая содержит экземпляр каждого из ряда ограничений. Первый предел - это 127 уровней вложенности блоков. (5.2.4.1 ИСО / МЭК 9899: 1999)

C не говорит, что любая действительная программа, которая содержит не более 127 уровней вложенности, должна быть переведена; это может быть неоправданно большим в других отношениях. Обоснованием было установить некоторый уровень ожидания, который могут иметь переносимые программы, позволяя широте не исключать небольшие реализации и реализации, предназначенные для небольших систем.

Короче говоря, если вам нужно более 127 уровней вложенности, это, вероятно, означает, что вы должны обратиться к документации вашей реализации, чтобы узнать, гарантирует ли она поддержку большего числа.

...