Я думаю, что ваша идея, вероятно, будет работать. Допустимые идентификаторы C ++ состоят из A-Z, a-z, 0-9 и подчеркивания, что на самом деле является надлежащим подмножеством идентификаторов XML (которые добавляют дефис, точку и набор символов Unicode в набор).
Вы можете попробовать такую конструкцию, чтобы получить ошибку времени компиляции:
#define SAFE_BOOST_SERIALIZATION_NVP(name) \
{ int name = 0; } ; BOOST_SERIALZATION_NVP(name)
Скобки ограничивают область действия фиктивной переменной только этой строкой, поэтому вы не загромождаете свою функцию фиктивными переменными. Вероятно, компилятор также оптимизирует фиктивную переменную, поэтому нет затрат времени выполнения. Когда я использую этот макрос в следующем коде, я получаю error: invalid intializer
:
#include "boost/serialization/nvp.hpp"
#define SAFE_BOOST_SERIALIZATION_NVP(name) \
{ int name = 0; } ; BOOST_SERIALIZATION_NVP(name)
int main(int argc, char *argv[])
{
int foo[3] = { 10, 20, 30 };
int bar = 10;
SAFE_BOOST_SERIALIZATION_NVP(foo[0]);
return 0;
}
Если я заменю foo[0]
на bar
при вызове SAFE_BOOST_SERIALIZATION_NVP
, он компилируется без ошибок.