В C, как вы объявляете членов структуры неустойчивыми?
Как вы объявляете какой-то конкретный элемент структуры как volatile?
Ответы
Ответ 1
Точно так же, как не struct
:
#include <stdio.h>
int main (int c, char *v[]) {
struct _a {
int a1;
volatile int a2;
int a3;
} a;
a.a1 = 1;
a.a2 = 2;
a.a3 = 3;
return 0;
}
Вы можете пометить весь struct
как volatile с помощью "volatile struct _a {...}"
, но метод выше для отдельных полей.
Ответ 2
Должно быть довольно прямо в соответствии с эта статья:
Наконец, если вы примените volatile к структура или объединение, все содержимое структуры/объединения нестабильны. Если вы не хотите этого поведения, вы можете применить изменчивый квалификатор к отдельных членов структура/объединение.
Ответ 3
Мне нужно уточнить volatile для C/C++, потому что здесь был неправильный ответ. Я программирую микроконтроллеров с 1994 года, где это ключевое слово очень полезно и часто нужно.
volatile никогда не сломает ваш код, его использование никогда не будет рискованным. Ключевое слово в основном гарантирует, что переменная не оптимизирована компилятором. Худшее, что может случиться, если вы злоупотребите этим ключевым словом, это то, что ваша программа будет немного больше и медленнее.
Вот когда вам нужно это ключевое слово для переменной:
- У вас есть переменная, которая записана внутри функции прерывания.
А ТАКЖЕ
- Эта же переменная читается или записывается во внешние функции прерывания.
ИЛИ ЖЕ
Если у вас есть две функции прерывания с различным приоритетом, которые используют переменную, вам также следует использовать 'volatile'.
В противном случае ключевое слово не нужно.
Что касается аппаратных регистров, они должны рассматриваться как изменчивые, даже без ключевого слова, если вы не делаете странные вещи в своей программе.
Ответ 4
Просто предупреждение о ключевом слове C/С++ volatile.
Если вы не знаете, что делаете, вы никогда не должны его использовать.
C/С++ volatile!= java/С# volatile
volatile не помогает в потоковом коде, если вы действительно не знаете, что делаете, вам нужно использовать атомный шаблон С++ 0x (или что-то подобное).
Единственный раз, когда мне приходилось использовать volatile - это управлять аппаратными регистрами.
Ответ 5
Если члены, объявленные как изменчивые, не изменяются из-за обслуживания некоторого прерывания (т.е. обработчик сигнала или другая (близкая) атомная переменная), вероятно, вы, вероятно, не будете использовать volatile (поскольку большинство компиляторов оптимизирует его, если его не близко достаточно).
В противном случае, как говорили другие, просто используйте его, затем изучите дампы asm, чтобы убедиться, что ваш компилятор действительно согласен с вами:)
В некоторых случаях, т.е. некоторые версии gcc.. его стоит проверить эти дампы.
Ответ 6
Я только что закончил структуру данных, в которой было очевидно, где требовался изменчивый квалификатор, но по другой причине, чем указанные выше: это просто потому, что структура требует принудительного блокирующего механизма из-за (i) прямого доступа и (ii) эквивалентный вызов.
Прямой доступ связан с постоянным чтением и записью в ОЗУ.
Эквивалентный вызов работает со сменными потоками методов.
Мне не очень повезло с этим ключевым словом, если компилятор точно не знает, что с этим делать. И это мой личный опыт. Но мне интересно изучить, как это напрямую влияет на кросс-платформенную компиляцию, например, между системным вызовом низкого уровня и внутренней базой данных.