В C и С++ см. следующий код:
extern int output;
extern int input;
extern int error_flag;
void func(void)
{
if (0 != error_flag)
{
output = -1;
}
else
{
output = input;
}
}
-
Является ли компилятору разрешено компилировать вышеуказанный код так же, как если бы он выглядел ниже?
extern int output; extern int input; extern int error_flag; void func(void) { output = -1; if (0 == error_flag) { output = input; } }Другими словами, компилятору разрешено генерировать (из первого фрагмента) код, который всегда выполняет временное присвоение от -1 до
output, а затем присваивает значениеinputoutputв зависимости от состоянияerror_flag -
Можно ли разрешить компилятору сделать это, если
outputбудет объявлено изменчивым? -
Разрешено ли компилятору сделать это, если
outputбудет объявлено какatomic_int(stdatomic.h)?
Обновление после комментария Дэвида Шварца:
Если компилятор может добавлять дополнительные записи в переменную, кажется, что из кода C невозможно определить, существует ли гонка данных или нет. Как это определить?