是否可以打印结构名称?

说我有一个结构:

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/

10-11 23:21
查看更多