C Language
Ограничения
Поиск…
замечания
Ограничения - это термин, используемый во всех существующих спецификациях 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) точная формулировка:
Если идентификатор не имеет привязки, должно быть не более одного объявления идентификатора (в указателе или спецификаторе типа) с той же областью и в том же пространстве имен, за исключением тегов, указанных в 6.7.2.3.
Унарные арифметические операторы
Унарные +
и -
операторы применимы только к арифметическим типам, поэтому, если, например, один пытается использовать их в структуре, программа создаст диагностику, например:
struct foo
{
bool bar;
};
void baz(void)
{
struct foo testStruct;
-testStruct; /* This breaks the constraint so must produce a diagnostic */
}