Поиск…


замечания

Ограничения - это термин, используемый во всех существующих спецификациях C (недавно ISO-IEC 9899-2011). Они являются одной из трех частей языка, описанных в разделе 6 стандарта (наряду с синтаксисом и семантикой).

ISO-IEC 9899-2011 определяет ограничение как:

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

(Также обратите внимание, что в терминах стандарта C «ограничение времени выполнения» не является своего рода ограничением и имеет множество разных правил).

Другими словами, ограничение описывает правило языка, которое делает иначе синтаксически действующую программу незаконной. В этом отношении ограничения несколько напоминают неопределенное поведение, любая программа, которая не следует за ними, не определяется в терминах языка C.

С другой стороны, ограничения имеют очень важное отличие от Undefined Behaviors. А именно, для обеспечения диагностического сообщения во время фазы перевода (части компиляции) требуется выполнение, если нарушение нарушено, это сообщение может быть предупреждением или может остановить компиляцию.

Дублирующие имена переменных в той же области

Пример ограничения, выраженного в стандарте C, имеет две переменные с одним и тем же именем, объявленные в области 1) , например:

void foo(int bar)
{
    int var;
    double var;
}

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

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


1) точная формулировка:

C99

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

Унарные арифметические операторы

Унарные + и - операторы применимы только к арифметическим типам, поэтому, если, например, один пытается использовать их в структуре, программа создаст диагностику, например:

struct foo
{
    bool bar;
};

void baz(void)
{
   struct foo testStruct;
   -testStruct; /* This breaks the constraint so must produce a diagnostic */
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow