Мне когда-то приходилось делать нечто подобное, и в конце концов я сделал что-то странное, но очень надежное. Разобраться во всех возможностях определения значений сложно, например, вам нужно обработать
#include "someotherfile.h"
enum NewEnum {
A = -5,
B = SOME_OTHER_ENUM,
C,
D = 3
};
(что действительно противно, и никто никогда не должен делать ...)
В итоге частью моего процесса сборки был сценарий perl, который анализировал заголовочный файл для всех перечислений и определений, а затем создавал .c-файл, который включал заголовок и представлял собой не что иное, как кучу операторов print фактическое значение для каждого определения. Этот файл был скомпилирован и выполнен, а выходные данные использовались для создания следующего исходного файла (в моем случае, Java).
Это гарантировало, что я получил правильные значения, так как я использовал препроцессор C и компилятор для получения ответов.