В 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
, а затем присваивает значениеinput
output
в зависимости от состоянияerror_flag
-
Можно ли разрешить компилятору сделать это, если
output
будет объявлено изменчивым? -
Разрешено ли компилятору сделать это, если
output
будет объявлено какatomic_int
(stdatomic.h)?
Обновление после комментария Дэвида Шварца:
Если компилятор может добавлять дополнительные записи в переменную, кажется, что из кода C невозможно определить, существует ли гонка данных или нет. Как это определить?