5

コンパイルすると実際に何が起こりますか:

int main; 

main()であるはずで、エラーが発生していませんか?

CodeBlocksでコードをコンパイルしようとしましたが、エラーなしで完全にコンパイルされました。

4

2 に答える 2

7

mainCソースファイルは関数を持っている必要がないのでエラーではありませんmain。同じスコープで2回定義しようとしない限り、好きなように定義できます。これはプログラム全体なので問題ありませんがmain、検索する関数がないため、プログラムは確実に正しく実行されません。

mainと呼ばれる、0に初期化されたグローバル(外部)変数を宣言するだけです。リンカーは、存在しない場合は通常エラーを発行しますが、外部変数の存在に満足している可能性があります(ポインターであると想定しています)。 。

編集:デバッガーでこれを少し調べましたが、確かにmain値は0です。つまり、変数はキャストなしでポインターとして使用されています。そのため、初期化コードはアドレス0にある関数を実行しようとし、プラットフォームでセグメンテーション違反が発生します。

于 2013-03-09T11:41:33.447 に答える
3

スコープが正しくない(または理解されていない)ため、ここで混乱していると思います。

ここで宣言がコンパイラによって渡されていると言うときint main;、私はあなたがそれを関数スコープ内で宣言していると仮定しています。ただし、グローバルスコープで宣言しようとすると、コンパイラは再定義エラーをスローします。

したがって、同じスコープ内に2つの同一の識別子がない限り、コンパイラーは満足し、道を譲ることができます。

以下のコードは再定義エラーを出します:

int main;

int main()
{
  printf("In main\n");
}

以下のコードは、mainのスコープが関数内でのみ制限されており、コンパイラーがint main変数を考慮し、結果が5として出力されるため、変更されません。

int main()
{ 
   int main = 5;
   printf("In main, value of main is %d\n", main);
}

ただし、以下のコードはメインのアドレスを出力します

int main()
{
       printf("In main, value of main is %d\n", main);
}

編集: コメントを読んだ後、ここでの重要な問題は、「C」プログラムが機能し始めるために必要なメイン機能がまったくないことだと感じています。main関数がなく、int main;変数を宣言するだけの場合でも、コードはコンパイルされる可能性がありますが、mainは整数変数であるのに対し、関数であることが期待されるため、実行すると混乱と混乱が生じます。しかし、あなたが私の上記の答えに従ってあなたのメインを管理下に置いている限り、あなたはうまくやるべきです。

Cプログラムのコンパイルと実行の概念を説明しているこのリンクにアクセスできます

于 2013-03-09T12:00:38.583 に答える