Я могу воспроизвести описанное вами поведение только в clang 1 и только в случае сбоя кода в bla.c
на этапе связывания 2 . В этих обстоятельствах удаление, вероятно, происходит по следующей причине:
Компилятор создает конечный файл для хранения конечного исполняемого файла, как только начинается связывание, но при сбое связывания файл удаляется. Таким образом, исходный bla.c
исчезает, потому что он начинает перезаписываться исполняемым файлом, но этот файл также удаляется, потому что не удалось связать и исполняемый файл никогда не будет успешно создан. Таким образом, вы не получите ни один файл.
1 G CC просто отказывается иметь выходной файл с тем же именем, что и исходный файл, но возможно более старые версии ведет себя так, как вы описали.
2 Если он компилируется, bla.c
заменяется исполняемым файлом.