В 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) эквивалентный вызов.


Прямой доступ связан с постоянным чтением и записью в ОЗУ.

Эквивалентный вызов работает со сменными потоками методов.


Мне не очень повезло с этим ключевым словом, если компилятор точно не знает, что с этим делать. И это мой личный опыт. Но мне интересно изучить, как это напрямую влияет на кросс-платформенную компиляцию, например, между системным вызовом низкого уровня и внутренней базой данных.