2009-06-11 6 views
12

У меня проблема с кодом низкого уровня, который я пишу, мне нужно использовать объекты как изменчивые, но это не обязательно, так что я хочу, чтобы типы были объявлены как изменчивые (для повторного использования). Однако я могу определить указатель на квалифицированный вариант структуры, подробно описанный в следующем сегменте.Летучие семантики в C99

struct x { 
    int bar; 
}; 

struct x foobar; 
... 
volatile struct x *foo = &foobar; 

Теперь Foo фактически является указатель на объект типа:

volatile struct x { 
    volatile int x; 
}; 

так изменчиво применяется ко всем членам структуры. Теперь мой вопрос в том, когда объект содержит указатель на другой объект, как применяется летучесть?

struct x { 
    struct y *bar; 
}; 

будет указатель на летучем экземпляр х, то тогда относиться к этому как:

volatile struct x { 
    struct y * volatile bar; 
}; 

или как:

volatile struct x { 
    volatile struct y * volatile bar; 
}; 

Я прочитал стандарт C, и не очень ясен в этом отношении, и я могу легко интерпретировать формулировку несколькими способами.

ответ

4

В вашем примере вы получите , чтобы получить изменчивый указатель, вот и все, волатильность не распространяется на объект.

Расширение моего ответа volatile - это расслабленный атом, это означает, что доступ является атомарным, но инструкций не будет. Таким образом, вы не можете никоим образом увеличивать или уменьшать изменчивость, поэтому вы не можете использовать volatile pointer для interation, только операции store/load (assigment). То же самое относится к int или другому номеру, а volatile также не будет работать с поплавками, потому что они обрабатываются в конвейере FPU, а не в CPU. В целом волатильность не слишком полезна, но компиляторы Microsoft автоматически размещают охранники команд вокруг летучих, делая их истинными атомными значениями, но это не является частью стандарта.

+0

http://www.netrino.com/node/80 Кажется, что поддерживает эту идею. Я никогда не читал на волевых. Хорошая вещь. – Kieveli

+1

«volatile не слишком полезны»: не знают о программном обеспечении ПК, но во встроенных системах они необходимы для объявления аппаратных регистров или переменных, которые могут быть изменены в прерываниях. –

+0

Очень хорошая точка! Прошло несколько лет с момента моего последнего встроенного проекта, поэтому я забыл об этом. В любом случае, это сработало, потому что это было для грузов и магазинов. На ПК легко забыть о большинстве прерываний, поскольку они абстрагируются от ОС api. –

2

Чтение по стандарту here, кажется, что указатель является изменчивым, но не фактическим содержимым самой структуры. Я интерпретировал это из приведенного примера, const t * volatile p (внизу ссылки). Формулировка, однако, является расплывчатым, но я думаю, что это было бы подобный пример:

struct foo { 
    int bar; 
}; 

struct foo *volatile x; 

Обратите внимание, что я не пробовал, так что я может быть дико неправильно ... это просто то, что я имею собранные из беглого прочтения стандарта.

Кроме того, cdecl действительно устраняет некоторые неопределенности.Например:

Cdecl> объяснить volatile struct x* foo
объявлять Foo как указатель на летучем структуры х

Принимая во внимание:

Cdecl> объяснить struct x* volatile foo
объявлять Foo, как летучий указатель на структуру x

В одном случае структура является изменчивой. В другом - указатель.

+1

, так что не могли бы вы просто сделать volatile struct x * volatile foo; для volatile pointer и struct? – Earlz

+0

@earlz: Да. В точку. volatile struct x * volatile foo - изменчивый указатель на изменчивую структуру x. – FreeMemory