是否可以打印结构名称?
说我有一个结构:
typedef struct someName{
uint16_t value;
uint16_t field;
} someName_t;
someName_t test;
printf("%" PRIu16 "\n", test;
printf("%" PRIu16 "\n", test.value);
打印test.value是oke。打印测试给我警告。
这是打印结构名称的正确方法吗,甚至在C语言中也可以吗?
首先,PRIu16是我在stackoverflow上发现的,这是打印uint16_t的正确方法。
我想打印名称someName_t。
最佳答案
您可以使用类似这样的东西来声明您的结构,首先,您需要一些定义如下的宏:
#define BEGIN_NAMED_STRUCT(structName) \
typedef struct structName \
{ \
const char* __name;
#define END_NAMED_STRUCT(structName) \
} structName##_t; \
init_##structName( structName* s );
#define INIT_NAMED_STRUCT_TYPE( structName ) \
static const char* structName##__name = #structName; \
void init_##structName( structName* s ) \
{ \
s->__name = structName##__name; \
}
然后在您的.h或声明的任何地方,都应像下面这样声明结构:
BEGIN_NAMED_STRUCT(someName)
uint16_t value;
uint16_t field;
END_NAMED_STRUCT(someName);
在.c文件中,您必须初始化元数据,如下所示:
INIT_NAMED_STRUCT_TYPE( someName );
然后,您可以在程序中执行以下操作,这样声明的所有结构都将具有“ __name”成员,您可以随时访问该成员:
int main()
{
someName_t mySomeInstance;
init_someName( &mySomeInstance );
printf( mySomeInstance->__name );
return 0;
}
但这很容易出错,除非您开发了大量功能来提供安全性,否则由于添加到结构的元数据的度量以及其他问题。在C ++中,您可以执行类似的操作,但要利用函数重载和模板,这使此技术比C中的意义更大。
顺便说一句,我没有测试这个特定的代码,我匆匆写了它,所以它可能无法按预期工作:)
关于c - 在C中打印结构名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23780942/