структуры непрямого преобразования типов от константного к неконстантному через ifdefs в заголовочном файле - PullRequest
0 голосов
/ 03 января 2019

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

#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 для выдачи всех предупреждений о несанкционированном доступе к записи, а второй без этого флага для создания скомпилированного объектного файла без каких-либо возможных вредных побочных эффектов от оптимизации компилятора.

1 Ответ

0 голосов
/ 03 января 2019

Это опасный способ сделать, если вы включите заголовок, используя EXTCONST, в источник, определяющий ALLOW_WRITE, а также в другой источник без определения ALLOW_WRITE, два источника не увидят одинаковые определения.

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

Все источники имеютиспользовать одни и те же определения.

...