サーチ…


備考

制約は、すべての既存のC仕様(最近のISO-IEC 9899-2011)で使用されている用語です。それらは、標準の第6節に記述されている言語の3つの部分の1つです(サイド構文とセマンティクスに沿って)。

ISO-IEC 9899-2011は、制約を次のように定義しています。

言語要素の解説を解釈するための構文的または意味的な制限

(また、C標準に関して、「実行時制約」は一種の制約ではなく、広範囲に異なる規則を持っていることにも注意してください。)

言い換えれば、制約は文法上有効なプログラムを違法にする言語の規則を記述する。この点では、制約は未定義の動作と多少似ていますが、それに従わないプログラムはC言語で定義されていません。

一方、制約は未定義ビヘイビアと非常に大きな違いがあります。すなわち、制約が破られた場合、翻訳フェーズ(コンパイルの一部)中に診断メッセージを提供する実装が必要です。このメッセージは警告であるか、コンパイルを停止する可能性があります。

同じスコープ内の重複する変数名

C標準で表現されている制約の例として、スコープ1)で宣言された同じ名前の2つの変数があります。たとえば、次のようになります。

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