最近、小さなCテストプログラムを入力する必要があり、その過程で誤ってのvooid
代わりにを使用して、メイン関数のスペルミスを犯しましたvoid
。
それでもまだ機能しました。
それを最小の完全版に減らして、私は次のようになりました:
int main (vooid) {
return 42;
}
これは確かにコンパイル(gcc -Wall -o myprog myprog.c
)を行い、実行すると42を返します。
この有効なコードはどのくらい正確ですか?
これが私のbash
シェルから切り取って貼り付けた筆記録で、私がやっていることを示しています。
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
実際には、UB、@ pmgについてはわかりません。ISOは特に
—
paxdiablo
main
、標準的な2つの標準的なものからの他の可能性を考慮しています。移植性のために、あなたはそれらの2つのうちの1つを使うべきです、しかし私はUBがここに適用するとは思いません。
うーん:ホストされた環境
—
pmg
main
では、2つの標準形式(2.1.2.2)のいずれかが必要です。しかし、あなたが正しい@paxです。独立した環境では、識別子main
は特別なものではありません。関数として使用する場合、識別子は任意の型で、任意の型のパラメータをいくつでも持つことができます。
C99では、自立は完全に実装定義です。ホスト型の場合、セクション5.1.2.2.1は「または他の実装定義の方法で」最後に述べているため、最低でも2つの正規形式が必要ですが、他の形式も使用できます(これにより、UNIXy
—
paxdiablo
int main (int argc, char *argv[], char *envp[]);
を準拠させることができます) )。
int
パラメーターでmainを定義することにより、未定義の動作を呼び出します。何かが起こる可能性があります:)