我想将一些数据输出到文件中。例如,假设我有两个双精度矢量:
vector<double> data1(10);
vector<double> data2(10);
有一种简单的方法可以将其输出到文件中,以便第一行包含标题'data1'和'data2',后跟实际内容。功能哪个 输出数据将传递各种不同的数组,因此硬编码名称 标题是不可能的 - 理想情况下我想转换变量名称 到某个字符串,然后输出该字符串,后跟向量数组的内容。但是,我不确定如何将变量名'data1'转换为字符串, 或者确实如果它可以轻松完成(从阅读论坛我的猜测是不可以) 如果这是不可能的,替代方案可能是使用关联 容器如地图或者更简单的“对”容器。
pair<vector<double>,string> data1(10,'data1');
欢迎任何建议!
答案 0 :(得分:39)
您可以使用预处理器“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>
。但这应该足够了。)
答案 1 :(得分:7)
试试这个:
#define GET_VARIABLE_NAME(Variable) (#Variable)
//在函数中
int var=0;
char* var_name= GET_VARIABLE_NAME(var);
答案 2 :(得分:2)
你可以使用预处理器,有一个stringify标记,但它只能从源代码获得,而不是函数(你可以获得参数名称)。
答案 3 :(得分:2)
稍微改编自@ sarnold的答案,对于C ++:
#define DEBUG(x) std::cout << #x << " = " << x << std::endl;
使用它的示例程序:
int main() {
int foo = 1;
DEBUG(foo);
return 0;
}
答案 4 :(得分:1)
我认为明显的答案是让执行输出的函数将标题文本作为字符串参数。
答案 5 :(得分:1)
我遇到了同样的问题。经过一些实验,我创建了以下宏,将变量,字段,函数,方法和类型的名称转换为字符串。
#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));
当我编写从输入流中读取数据的解析器时,我使用这样的代码,如果解析的变量超出范围,它会抛出一个异常,其变量名称无法通过有效性检查。
答案 6 :(得分:0)
对于这种情况,我制作了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
答案 7 :(得分:0)
我也有类似的追求。在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
。
参加聚会有点晚了,但是我希望这可以帮助那里的任何人!