「int main(vooid)」?それはどのように機能しますか?


135

最近、小さな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

単一のintパラメーターでmainを定義することにより、未定義の動作を呼び出します。何かが起こる可能性があります:)
pmg

9
実際には、UB、@ pmgについてはわかりません。ISOは特にmain、標準的な2つの標準的なものからの他の可能性を考慮しています。移植性のために、あなたはそれらの2つのうちの1つを使うべきです、しかし私はUBがここに適用するとは思いません。
paxdiablo

うーん:ホストされた環境mainでは、2つの標準形式(2.1.2.2)のいずれかが必要です。しかし、あなたが正しい@paxです。独立した環境では、識別子mainは特別なものではありません。関数として使用する場合、識別子は任意の型で、任意の型のパラメータをいくつでも持つことができます。
pmg

2
C99では、自立は完全に実装定義です。ホスト型の場合、セクション5.1.2.2.1は「または他の実装定義の方法で」最後に述べているため、最低でも2つの正規形式が必要ですが、他の形式も使用できます(これにより、UNIXy int main (int argc, char *argv[], char *envp[]);を準拠させることができます) )。
paxdiablo

回答:


220

それは単に「古いスタイルの」関数宣言構文を使用しています。intと呼ばれるパラメータを暗黙的に宣言していますvooid


2
これは事実のようです。「vooid = 42; return vooid;」を追加した場合 メインに、あなたはまた、42の戻り値取得
ジェフエイムズ

43
ああ、そうだね。追加した場合-std=c99、取得しqq.c:1: warning: type of 'vooid' defaults to 'int'ます。
paxdiablo

70

myprog.cには以下が含まれているため、これは有効なコードです。

int main (vooid) // vooid is of type int, allowed, and an alias for argc
{     
  return 42; // The answer to the Ultimate Question
} 

vooid1と渡された引数の数(つまりargc)を含みます。つまり、実際には、名前argcをに変更するだけvooidです。


11
「返りボイド」をすると 代わりに、実際には1 + numを返します。引数の。
ジェフエイムズ

6
@ジェフ、プログラムの名前は議論としてカウントされるため、+ 1
マーティンベケット

23

Cでは、関数の引数のデフォルトの型はintです。したがって、プログラムは単語をvooidとして扱いint main(int vooid)ます。これは完全に有効なコードです。


20

それだけですgcc -std=c89 -Wall -o qq qq.cgcc -std=gnu89 -Wall -o qq qq.c警告を発していません。他のすべての標準は、の暗黙の型intに関する警告を発しvooidます。

int main(chart)と同じように動作しint main (vooid)ます。

return vooid; コマンドライン引数の数を返します。

Debianテストシステムでgcc 4.4.5を使用してテストしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.