あまり。C標準では、受け入れる必要のある変換単位に絶対的な最小制限は設定されていません。そのため、完全に正確なチェッカーを作成するのは簡単ですが、実際にはまったく役に立ちません。
#include <stdio.h>
int main(int argc, char **argv) {
int i;
for (i=1; i<argc; i++)
fprintf(stderr, "`%s`: Translation limit (potentially) exceeded.\n", argv[i]);
return 0;
}
はい、これはどんなに些細なことでも、すべてを拒否します。それは基準に準拠しています。私が言ったように、それは実際には全く役に立たない。残念ながら、実際にはそれほどうまくいくことはできません。別の実装に移植することを決定した場合、これまでに見たことのない奇妙なリソース制限に遭遇する可能性があります。 hello world ")は、はるかに小規模なシステム上または数百のコンパイラで許可されているにもかかわらず、リソース制限を超える可能性があります。
編集:
「HelloWorld」プログラムが厳密に準拠していない理由
まず、「厳密に準拠する」の定義を言い換える価値があります。「厳密に準拠するプログラムは、この国際規格で指定されている言語とライブラリの機能のみを使用するものとします。2)未指定、未定義、または実装定義の動作であり、実装の最小制限を超えてはなりません。」
「Hello、World」が厳密に準拠していない理由は実際にはいくつかあります。まず、上記のように、実装制限の最小要件は完全に無意味です。受け入れられる特定の制限を満たすプログラムが必要ですが、他のプログラムは、たとえそれが近づいていなくても、受け入れられる必要はありません。それらの制限のいずれかに。要件の記述方法を考えると、標準では実際には最小実装制限が定義されていないため、最小実装制限を超えないプログラムなどがあるかどうかは(せいぜい)疑問視されます。
次に、翻訳のフェーズ1で、「物理ソースファイルのマルチバイト文字は、実装で定義された方法で、ソース文字セットにマップされます...」(§5.1.1.2/ 1)。「Hello、World!」以降 (または任意のバリアント)は、ソースファイルで文字列リテラルとして提供され、実装定義の方法でソース文字セットにマップできます。実装は、(ばかげた例では)文字列リテラルをROT13でエンコードすることを自由に決定でき、その事実が適切に文書化されている限り、それは完全に正当です。
第三に、出力は通常、を介して書き込まれstdout
ます。stdout
テキストストリームです。標準によると、「ホスト環境でテキストを表すためのさまざまな規則に準拠するために、入力と出力で文字を追加、変更、または削除する必要がある場合があります。したがって、文字間に1対1の対応がある必要はありません。ストリーム内および外部表現内のもの。」(§7.19.2/ 2)そのため、実装は(たとえば)出力に対してハフマン圧縮を実行できます(月曜日、水曜日、または金曜日)。
したがって、「Hello、World!」からの出力には、(少なくとも)3つの異なるポイントがあります。実装で定義された特性に依存します。いずれの特性でも、厳密に準拠したプログラムの定義に適合できなくなります。