48

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

vector<double> data1(10);
vector<double> data2(10); 

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

pair<vector<double>,string> data1(10,'data1');  

欢迎大家提出意见!

4

8 回答 8

71

你可以使用预处理器“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>。但这应该足够了。)

于 2010-08-02T10:40:03.223 回答
19

试试这个:

#define GET_VARIABLE_NAME(Variable) (#Variable)

//在函数中

int var=0;    
char* var_name= GET_VARIABLE_NAME(var);
于 2016-09-29T16:41:24.077 回答
4

略微改编自@sarnold 的答案,用于 C++:

#define DEBUG(x) std::cout << #x << " = " << x << std::endl;

一个使用它的示例程序:

int main() {
    int foo = 1;
    DEBUG(foo);

    return 0;
}
于 2015-04-06T16:18:25.433 回答
4

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

#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));

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

于 2016-09-06T09:49:02.273 回答
3

您可以使用预处理器,有一个 stringify 标记,但它只能从源代码中获得,而不是函数(您会得到参数名称)。

于 2010-08-02T10:30:27.657 回答
2

我也有类似的追求。在 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

聚会有点晚了,但我希望这可以帮助那里的任何人!

于 2020-11-23T14:29:22.917 回答
1

我认为显而易见的答案是让执行输出的函数将标题文本作为字符串参数。

于 2010-08-02T10:34:15.527 回答
1

对于这种情况,我制作了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
于 2018-02-05T10:35:30.747 回答