[英]converting a variable name to a string in C++
我想将一些数据输出到文件中。 例如假设我有两个双精度向量:
vector<double> data1(10);
vector<double> data2(10);
有没有一种简单的方法可以将其输出到文件,以便第一行包含标题“data1”和“data2”,后跟实际内容。 输出数据的函数将传递各种不同的数组,因此不可能对标题的名称进行硬编码 - 理想情况下,我想将变量名称转换为某个字符串,然后输出该字符串,后跟向量数组的内容。 但是,我不确定如何将变量名 'data1' 转换为字符串,或者实际上是否可以轻松完成(从阅读论坛我的猜测是它不能)如果这是不可能的,另一种可能是使用关联容器,例如地图或更简单的“配对”容器。
pair<vector<double>,string> data1(10,'data1');
欢迎大家提出意见!
您可以使用预处理器“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
(抱歉printf
,我从来没有掌握<iostream>
。但这应该足够了。)
尝试这个:
#define GET_VARIABLE_NAME(Variable) (#Variable)
//在函数中
int var=0;
char* var_name= GET_VARIABLE_NAME(var);
我有同样的问题。 经过一些实验,我创建了以下宏,将变量、字段、函数、方法和类型的名称转换为字符串。
#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));
当我编写从输入流读取数据的解析器时,我会使用这样的代码,如果解析的变量超出范围,它会抛出一个异常,其中包含未通过有效性检查的变量名称。
稍微改编自@sarnold 的回答,适用于 C++:
#define DEBUG(x) std::cout << #x << " = " << x << std::endl;
一个使用这个的示例程序:
int main() {
int foo = 1;
DEBUG(foo);
return 0;
}
您可以使用预处理器,有一个 stringify 标记,但它只能从源中获得,不能从函数中获得(您将获得参数名称)。
我原以为显而易见的答案是让执行输出的函数将标题文本作为字符串参数。
对于这种情况,我制作了nameof()宏。 它返回一个变量、类型或成员的 std::string 名称。 它的工作原理类似于 C# 中的 nameof()。
例如:
#include "nameof.h"
std::vector<double> data1(10);
std::string name = nameof(data1); // "data1"
struct Foo1
{
struct Foo2
{
Foo1* foo1;
};
Foo1* foo1;
Foo2 foo2;
};
name = nameof(Foo1::foo1->foo2.foo1); // "foo1"
name = nameof(123); // std::logic_error exception
我有一个类似的追求。 在 Qt 中,我厌倦了在写入qDebug()
时不断地将变量名称写为没有自动完成功能的字符串。 在对不同的宏和函数进行了大量反复试验后,我发现这个宏效果很好:
#define PRINT(x) ", " << #x << ": " << x
用法示例:
int someVariable = 42;
double anotherVariable = 13.37;
qDebug().nospace() << "Some text" << PRINT(someVariable) << PRINT(anotherVariable);
输出:
Some text, someVariable: 42, anotherVariable: 13.37
我想这(或非常相似的东西)也适用于std::cout
。
聚会有点晚了,但我希望这可以帮助那里的任何人!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.