Модифицируемая статическая переменная изменяется в нестатической подставляемой функции
Встроенное ограничение, которое не уважают, происходит, когда вы обращаетесь к файлу, определяют объем модифицируемой статической переменной или задают локальную модифицируемую статическую переменную в нестатической встроенной функции. Средство проверки рассматривает переменную как модифицируемую, если это не const
- квалифицированный.
Например, var
модифицируемый static
переменная задана в inline
функциональный func
. g_step
модифицируемая статическая переменная осциллографа файла, упомянутая в той же встроенной функции.
static int g_step; inline void func (void) { static int var = 0; var += g_step; }
Когда вы измените статическую переменную в нескольких вызовах функции, вы ожидаете изменять ту же переменную в каждом вызове. Например, каждый раз вы вызываете func
, тот же экземпляр var1
постепенно увеличивается, но отдельный экземпляр var2
постепенно увеличивается.
void func(void) { static var1 = 0; var2 = 0; var1++; var2++; }
Если функция имеет встроенное и невстроенное определение (в отдельных файлах), когда вы вызываете функцию, стандарт C позволяет компиляторам использовать или встроенный или невстроенную форму (см. ISO®/IEC 9899:2011, секунда. 6.7.4). Если ваш компилятор использует встроенное определение в одном вызове и невстроенное определение в другом, вы больше не изменяете ту же переменную в обоих вызовах. Это поведение игнорирует ожидания от статической переменной.
Используйте одни из этих мер:
Если вы не намереваетесь изменить переменную, объявите его как const
.
Если вы не изменяете переменную, нет никакого вопроса неожиданной модификации.
Сделайте переменную non-static
. Удалите static
спецификатор от объявления.
Если переменная задана в функции, это становится регулярной локальной переменной. Если задано в осциллографе файла, это становится переменной экстерна. Убедитесь, что это изменение в поведении - то, что вы предназначаете.
Сделайте функциональный static
. Добавьте static
спецификатор к функциональному определению.
Если вы делаете функциональный static
, файл со встроенным определением всегда использует встроенное определение, когда функция вызвана. Другие файлы используют другое определение функции. Вопрос которого функционируют, определение привыкает, не оставлен компилятору.
Группа: Программирование |
Язык: C | C++ |
Значение по умолчанию: на |
Синтаксис командной строки:
INLINE_CONSTRAINT_NOT_RESPECTED |
Удар: носитель |