В моем проекте библиотеки C у меня есть перечисление, в котором перечислены все возможные типы данных, обрабатываемых библиотекой:
// lib.h
enum types {
VOID,
INT,
FLOAT,
CONST_INT,
CONST_FLOAT
}
Код будет скомпилирован в разделяемую библиотеку. В будущих версиях библиотеки мне потребуется вставлять новые записи в перечисление и изменять порядок существующих. Насколько я знаю, это нарушает совместимость с ABI, поскольку перечисление не преобразуется в набор символов, который попадает в библиотеку, а скорее приводит к тому, что любое целое число, которое компилятор присваивает каждой записи, будет жестко запрограммировано. Так ли это?
Если да, то было бы предпочтительнее вместо этого использовать постоянные глобальные переменные, чтобы они появлялись в таблице символов, и, таким образом, я мог бы изменить как порядок, так и значение, присвоенное каждому?
// lib.c
const int VOID = 1;
const int INT = 2;
const int FLOAT = 3;
const int CONST_INT = 4;
const int CONST_FLOAT = 5;
// lib.h
extern const int VOID;
extern const int INT;
extern const int FLOAT;
extern const int CONST_INT;
extern const int CONST_FLOAT;