Ни в стандарте C, ни в стандарте C ++ не делается попыток различать guish между объектами, которые будут изменены таким образом, чтобы компилятор не имел оснований ожидать, те, которые будут записаны только способами, компилятор понимает, но может также быть прочитан способами, которых не было бы ожидать, и те, которые, хотя и объявлены volatile
, фактически никогда не будут доступны способами, которые компилятор не ожидал (последняя ситуация может возникнуть с библиотеками, которые иногда будет использоваться в системах, где доступ к объектам осуществляется извне, а иногда и в системах, где это не так). Все объекты, не относящиеся к atomi c, к которым можно получить доступ способами, которых компилятор не ожидал, должны быть квалифицированы как volatile
, и поскольку - с точки зрения стандарта - все объекты, квалифицированные как volatile
, могут быть прочитаны или написано произвольными внешними средствами, любой доступ к такому объекту без квалификатора volatile
вызывает Undefined Behavior, , независимо от того, действительно ли происходит какой-либо внешний доступ . Авторы Стандарта, вероятно, признали, что, поскольку люди, желающие продавать компиляторы, будут разумно обращаться с такими случаями, не обращая внимания на то, обязаны ли они это делать, в Стандарте нет необходимости рассматривать такие случаи. Однако не все разработчики компиляторов связаны этим принципом.
Лучшим способом добиться такого поведения, вероятно, было бы скопировать UNIX_TIME
в пару обычных объектов, убедившись, что они совпадают и повторяются в противном случае выполняется попытка чтения, а затем передается адрес этой функции любым функциям, которым потребуется адрес объекта, хранящего время. Как отмечалось в другом месте, следует избегать таких функций, как localtime
, которые используют буферы stati c, использовать такие функции, как localtime_r
, но что важно, если кто-то хочет закрыть компилятор, - это скопировать объект в другое место перед использованием.