Я просто укажу вам на проект Clang / LLVM.
В этом проекте они создали способ кодирования данных с использованием простого описательного языка, который затем подается в инструмент (называемый tblgen).для генератора таблиц), который предназначен для создания файла C ++.Например, диагностика :
let Component = "Sema" in {
let CategoryName = "Semantic Issue" in {
// Constant expressions
def err_expr_not_ice : Error<
"expression is not an integer constant expression">;
....
В Clang имеется несколько тысяч диагностических сообщений, разделенных на несколько файлов.После обработки в tblgen они сгенерируют огромный файл .inc
, который для каждой диагностики будет содержать вызов макроса.Определив макрос и включив файл, вы можете создать таблицу C ++ (или что-нибудь еще на самом деле, но, как правило, для таблиц):
static const StaticDiagInfoRec StaticDiagInfo[] = {
#define DIAG(ENUM,CLASS,DEFAULT_MAPPING,DESC,GROUP, \
SFINAE,ACCESS,NOWERROR,SHOWINSYSHEADER, \
CATEGORY,BRIEF,FULL) \
{ diag::ENUM, DEFAULT_MAPPING, CLASS, SFINAE, ACCESS, \
NOWERROR, SHOWINSYSHEADER, CATEGORY, \
STR_SIZE(#ENUM, uint8_t), STR_SIZE(GROUP, uint8_t), \
STR_SIZE(DESC, uint16_t), STR_SIZE(BRIEF, uint16_t), \
STR_SIZE(FULL, uint16_t), \
#ENUM, GROUP, DESC, BRIEF, FULL },
#include "clang/Basic/DiagnosticCommonKinds.inc"
#include "clang/Basic/DiagnosticDriverKinds.inc"
#include "clang/Basic/DiagnosticFrontendKinds.inc"
#include "clang/Basic/DiagnosticLexKinds.inc"
#include "clang/Basic/DiagnosticParseKinds.inc"
#include "clang/Basic/DiagnosticASTKinds.inc"
#include "clang/Basic/DiagnosticSemaKinds.inc"
#include "clang/Basic/DiagnosticAnalysisKinds.inc"
#undef DIAG
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
И те же файлы могутсоздавать разные таблицы, поскольку вы можете писать макросы по своему желанию.
Это, конечно, очень специфическое использование.
Но не волнуйтесь, даже если модули нене сделаем это в C ++ 11, мы можем надеяться на C ++ 1x.