Во-первых, я понимаю, что это может быть невозможно, так как макросы раскрываются только один раз. Тем не менее, я надеюсь, что есть какой-то стандартный способ получить подобное поведение или предложения для других методов.
Я ищу способ выполнить проверку во время компиляции нашей сборки, которая вызовет ошибку в случае несовместимости. Следующее, конечно, не сработает, но, на мой взгляд, это самый простой способ донести идею:
версия.ч:
#define CODE_VERSION 2
#define VERSION(x) #if (CODE_VERSION > (x) ) \
#error "Incompatible version detected!" \
#endif
основной.с:
#include "version.h"
VERSION(1)
// ...and so on
Если выходные данные препроцессора возвращались в препроцессор, это должно было вызвать ошибку во время компиляции.
Итак, каков правильный способ добиться такого (или подобного) поведения? Для любопытных, идея заключается в том, чтобы избежать ручного анализа во время проверки достаточно большой кодовой базы, чтобы соответствовать процессу аудита (поскольку автоматический аудит гораздо менее обременительный).
#define STATIC_ASSERT(cond) int foo[(cond) ? 1 : -1]
для c соответствия 17.01.2011