この回答 によると、関数main()の使用は違法であり(§3.6.1.3)、その名前が潜在的に評価される式(§3.2)に含まれている場合に関数が使用されます。
私がこのコードを持っているとしましょう:
printf( "%p", &main );
関数の名前がmain()
式に表示されます&main
。
上記のコードは違法ですか?
はい。あなたが引用するように、標準はあなたが使用できないと言っています
main
。
関数のアドレスがと一致しないことにも注意してください"%p"
。対応する引数の型は;でなければなりません。void*
他のタイプ(多分を除くchar*
)は違法であり、未定義の動作になります。
は「使用」されていない(評価していない)ためmain
、指定したリンクに従って合法である必要があります。
main()
しかしのポインタまたはアドレスを使用することは通常ありませんmain()
。
とにかく、すべての関数(および変数などの任意のシンボル)と同様に、独自のアドレスを持っているため、許可されます。また、main()のアドレスが必要になる場合があります。特に、組み込みシステム用のコードを記述し、コードの動的ロードや実行時検査を行う場合はそうです。または、ブートローダーと実際に実行されているファームウェアがあります。
多くの場合main()
、動的にロードされるコード(FLASHからRAMなど)へのエントリポイントであるため、ブートローダーで参照されます(直接呼び出されるか、関連するポインターに割り当てられます)。
MicroC-OS/IIまたはVxWorksを参照してください-どちらもmain()
このように使用します