列挙型の定義と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
ステートメントを完全に省略すると(main
Cではで合法であり、と同等ですreturn 0;
)、それも消えます。
main
としてint main(int argc, char **argv)
、あなたが見るargc
と、argv
スタックにコピーされますが、神秘的なゼロの変数は、それらに加えて、まだそこにあります。