Я хочу сделать элементы структуры доступными для всех, но доступными для записи только для специально помеченного кода.Используя что-то вроде этого в заголовочном файле:
#ifdef ALLOW_WRITE
#define EXTCONST
#else
#define EXTCONST const
#endif
и помещая EXTCONST повсюду в struct typedefs, например:
typedef struct {
int a;
} EXTCONST typename;
Соответствующий файл .c имеет #define ALLOW_WRITE в начале, другие файлы имеютнет.
Я почти уверен, что это будет работать так, как ожидалось, по крайней мере, без агрессивной оптимизации.Два вопроса:
1) будет ли это работать правильно с включенными максимальными оптимизациями?
2) это правильно в соответствии со стандартами C?
ПРИМЕЧАНИЕ: я знаю, что это можетбыть сделано через функции получения, но я думаю, что st-> a-> b выглядит намного лучше и более интуитивно, чем a_get_b (st_get_a (st))
РЕЗЮМЕ: По крайней мере два человека говорят, что такое скрытое приведение типов небезопасно, и никто не говорит, что все в порядке.
Так что я буду использовать «улучшенный» способ проверки доступа «только для чтения».
#ifdef CONST_CHECK
#ifdef ALLOW_WRITE
#define EXTCONST
#else
#define EXTCONST const
#endif
#else
#define EXTCONST
#endif
И два раза запустить компилятор для исходных файлов ввопрос: один с параметром -DCONST_CHECK для выдачи всех предупреждений о несанкционированном доступе к записи, а второй без этого флага для создания скомпилированного объектного файла без каких-либо возможных вредных побочных эффектов от оптимизации компилятора.