Voici un simple fichier C avec une définition d'énumération et une mainfonction:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
Il transpile vers le LLVM IR suivant:
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
}
%2est évidemment la dvariable, qui se voit attribuer 2. À quoi %1correspond si zéro est retourné directement?
clang-9 -S -emit-llvm simple.c
main( godbolt.org/z/kEtS-s ). Le lien montre comment l'assembly est mappé à la source
main, la mystérieuse variable supplémentaire disparaît. Fait intéressant, il disparaît également si vous omettez returncomplètement la déclaration (ce qui est légal pour mainen C et équivalent à return 0;).
maincomme int main(int argc, char **argv)vous le voyez argcet argvcopié sur la pile, mais la mystérieuse variable zéro est toujours là en plus d'eux.