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

发布于 2024-09-12 14:41:39 字数 485 浏览 5 评论 0原文

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

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

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

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

欢迎任何建议!

I'd like to output some data to a file. For example assume I have two vectors of doubles:

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

is there an easy way to output this to a file so that the first row contains the headings 'data1' and 'data2' followed by the actual contents. The function which
outputs the data will be passed various different arrays so hardcoding the name
of the heading is not possible - ideally I'd like to convert the variable name
to some string and then output that string followed by the contents of the vector array. However, I'm not sure how to convert the variable name 'data1' to a string,
or indeed if it can easily be done (from reading the forums my guess is it can't)
If this is not possible an alternative might be to use an associative
container such as map or perhaps more simply a 'pair' container.

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

Any suggestions would be welcome!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

一桥轻雨一伞开 2024-09-19 14:41: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 感到抱歉,我从未掌握 的窍门>.但这应该足够了。)

You can use the preprocessor "stringify" # to do what you want:

#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

(Sorry for printf, I never got the hang of <iostream>. But this should be enough.)

狂之美人 2024-09-19 14:41:39

试试这个:

#define GET_VARIABLE_NAME(Variable) (#Variable)

//在函数中

int var=0;    
char* var_name= GET_VARIABLE_NAME(var);

try this:

#define GET_VARIABLE_NAME(Variable) (#Variable)

//in functions

int var=0;    
char* var_name= GET_VARIABLE_NAME(var);
猫弦 2024-09-19 14:41:39

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

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

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

I had the same problem. After a little bit of experimentation I created following macros that convert names of variables, fields, functions, methods and types to strings.

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

The code uses comma operator and void conversion to force compiler to check if variable, function, etc. really exists. The nice thing is that it works well with uninitialized variables too. I tested it on both VC and GCC with all pedantic options I found out without any warning messages.

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

int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable));

I use such code when I write parsers that reads data from input stream and if parsed variable is out of bounds it throws an exception with name of variable that failed my validity checks.

樱娆 2024-09-19 14:41:39

稍微改编自 @sarnold 的答案,对于 C++:

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

使用此的示例程序:

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

    return 0;
}

Slightly adapted from @sarnold's answer, for C++:

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

An example program which uses this:

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

    return 0;
}
盗梦空间 2024-09-19 14:41:39

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

You can use the preprocessor, there's a stringify token, but it's only available from the source, not to a function (you'd get the argument name).

ㄖ落Θ余辉 2024-09-19 14:41:39

我也有类似的追求。在 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 作为出色地。

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

I had a similar quest. In Qt, I got tired of constantly writing the variable name as a string without autocomplete when writing to qDebug().
After a lot of trial and error with different macros and functions, I found that this macro works great:

#define PRINT(x) ", " << #x << ": " << x

Example usage:

int someVariable = 42;
double anotherVariable = 13.37;
qDebug().nospace() << "Some text" << PRINT(someVariable) << PRINT(anotherVariable);

Output:

Some text, someVariable: 42, anotherVariable: 13.37

I guess this (or something very similar) will work for std::cout as well.

A bit late to the party, but I hope this can help anyone out there!

塔塔猫 2024-09-19 14:41:39

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

I'd have thought the obvious answer is to make the function that performs the output take the heading text as a string parameter.

靑春怀旧 2024-09-19 14:41:39

对于这种情况,我制作了 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

For this case I have made nameof() macro. It returns a std::string name of a variable, type or member. It works like nameof() in C#.

For Example:

#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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文