列挙型の定義とmain関数を含む簡単なCファイルを次に示します。
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
次のLLVM IRに転送されます。
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 2, i32* %2, align 4
ret i32 0
}
%2明らかにd変数であり、2が割り当てられます。%1ゼロが直接返される場合、何に対応しますか?
clang-9 -S -emit-llvm simple.c
main(godbolt.org/z/kEtS-s)。リンクは、アセンブリがソースにマップされる方法を示しています
mainに変更すると、謎の余分な変数が消えます。興味深いことに、returnステートメントを完全に省略すると(mainCではで合法であり、と同等ですreturn 0;)、それも消えます。
mainとしてint main(int argc, char **argv)、あなたが見るargcと、argvスタックにコピーされますが、神秘的なゼロの変数は、それらに加えて、まだそこにあります。