У меня была такая же проблема. После небольшого эксперимента я создал следующие макросы, которые преобразуют имена переменных, полей, функций, методов и типов в строки.
#define MACRO_VARIABLE_TO_STRING(Variable) (void(Variable),#Variable)
#define MACRO_FUNCTION_TO_STRING(Function) (void(&Function),#Function)
#define MACRO_METHOD_TO_STRING(ClassName,Method) (void(&ClassName::Method),#Method)
#define MACRO_TYPE_TO_STRING(Type) (void(sizeof(Type)),#Type)
Код использует оператор запятой и преобразование void, чтобы заставить компилятор проверить, действительно ли существует переменная, функция и т. Д. Приятно то, что он хорошо работает и с неинициализированными переменными. Я протестировал его как на VC, так и на GCC со всеми обнаруженными педантичными опциями без каких-либо предупреждений.
int GetAndPrintValue(const char* VariableName)
{
std::cout << VariableName << std::endl;
return 10;
}
int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable));
Я использую такой код, когда пишу парсеры, которые считывают данные из входного потока, и если анализируемая переменная выходит за пределы, генерируется исключение с именем переменной, которая не прошла проверку правильности.