在C++中将变量名转换为字符串

Waw*_*100 24 c++ string variables map std-pair

我想将一些数据输出到文件中.例如假设我有两个双打向量:

vector<double> data1(10);
vector<double> data2(10); 
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法将其输出到文件,以便第一行包含标题'data1'和'data2',后跟实际内容.输出数据的函数将传递各种不同的数组,因此不可能硬编码标题的名称 - 理想情况下,我想将变量名称转换为某个字符串,然后输出该字符串,后跟向量数组的内容.但是,我不确定如何将变量名'data1'转换为字符串,或者确实如果它可以很容易地完成(从阅读论坛我的猜测是不可以)如果这是不可能的替代可能是使用关联容器(如map)或更简单的"对"容器.

pair<vector<double>,string> data1(10,'data1');  
Run Code Online (Sandbox Code Playgroud)

欢迎大家提出意见!

sar*_*old 40

您可以使用预处理器"stringify" #来执行您想要的操作:

#include <stdio.h>

#define PRINTER(name) printer(#name, (name))

void printer(char *name, int value) {
    printf("name: %s\tvalue: %d\n", name, value);
}

int main (int argc, char* argv[]) {
    int foo = 0;
    int bar = 1;

    PRINTER(foo);
    PRINTER(bar);

    return 0;
}


name: foo   value: 0
name: bar   value: 1
Run Code Online (Sandbox Code Playgroud)

(对不起printf,我从来没有掌握过<iostream>.但这应该足够了.)

  • 这可能会有所帮助 - > http://gcc.gnu.org/onlinedocs/cpp/Stringification.html (2认同)

Sae*_*Mo7 8

试试这个:

#define GET_VARIABLE_NAME(Variable) (#Variable)
Run Code Online (Sandbox Code Playgroud)

//在函数中

int var=0;    
char* var_name= GET_VARIABLE_NAME(var);
Run Code Online (Sandbox Code Playgroud)


Tim*_*y_A 7

我有同样的问题。经过一些实验后,我创建了以下宏,将变量、字段、函数、方法和类型的名称转换为字符串。

#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)
Run Code Online (Sandbox Code Playgroud)

该代码使用逗号运算符和 void 转换来强制编译器检查变量、函数等是否确实存在。好处是它也可以很好地处理未初始化的变量。我在 VC 和 GCC 上测试了它,并使用我发现的所有迂腐选项,没有任何警告消息。

int GetAndPrintValue(const char* VariableName)
{
   std::cout << VariableName << std::endl;
   return 10;
}

int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable));
Run Code Online (Sandbox Code Playgroud)

当我编写从输入流读取数据的解析器时,我使用这样的代码,如果解析的变量超出范围,它会抛出一个异常,该异常的变量名称未通过有效性检查。