gpt4 book ai didi

c++ - 在编译时获取变量名的标准方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:35 26 4
gpt4 key购买 nike

在 C++11 或更高版本中是否有某种方法可以实现类似的行为:

int some_int;
std::string x=variable_name<some_int>::value; //Theoretical code
std::cout << x;

结果应该是:

some_int

如果没有,是否有编译器特定的方法来做到这一点?我的目标是 MSVS。

最佳答案

你问:

Is there some way in C++11 or higher to achieve a similar behavior to:

int some_int;
std::string x=type_name<some_int>::value; //Theoretical code
std::cout << x;

Result should be:

some_int

是的,您可以只使用预处理器的字符串化运算符 #:

#include <iostream>

#define NAME_OF( v ) #v

using namespace std;
auto main() -> int
{
int some_int;
//std::string x=type_name<some_int>::value; //Theoretical code
auto x = NAME_OF( some_int );
(void) some_int;
cout << x << endl;
}

如果您要求不同的东西,那么请发布一个新问题,因为这个问题现在已经得到回答(修改问题会使这个答案无效)。


作为现实世界用法的示例,下面是将变量及其名称传递给测试函数的宏:

#define TEST( v ) test( v, #v )

如果您想要编译时检查所讨论的名称是变量名还是类型名,那么您可以简单地应用sizeof,例如在逗号表达式中:

#define NAME_OF( v ) (sizeof(v), #v)

sizeof 与否的区别在于,是否保证纯粹在编译时完成,而不是可能生成代码以在运行时执行某些操作。

为避免可能的警告,您可以向 void 添加一个伪转换:

#define NAME_OF( v ) ((void) sizeof(v), #v)

为了让函数名也能工作,你可以添加一个typeid:

#define NAME_OF( name ) ((void) sizeof(typeid(name)), #name)

完整示例:

#include <typeinfo>

#define NAME_OF( name ) ((void) sizeof(typeid(name)), #name)

void foo() {}

#include <iostream>
using namespace std;
auto main() -> int
{
int some_int;
(void) some_int;
//std::string x=type_name<some_int>::value; //Theoretical code
auto v = NAME_OF( some_int );
auto t = NAME_OF( int );
auto f = NAME_OF( foo );
#ifdef TEST_CHECKING
(void) NAME_OF( not_defined );
#endif
cout << v << ' ' << t << ' ' << f << endl;
}

不过,检查并非 100% 完美,因为仍然可以将函数调用传递给 NAME_OF 宏。

关于c++ - 在编译时获取变量名的标准方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38696440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com