在C中打印结构的名称

时间:2014-05-21 10:44:44

标签: c struct printf

是否可以打印结构名称?

说我有一个结构:

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。

5 个答案:

答案 0 :(得分:6)

您可以尝试这样的事情(它会打印test = 0):

#define DUMP(varname) fprintf(stderr, "%s = %x", #varname, varname);

typedef struct someName 
{
   int  value;
   int  field;
} someName_t;

someName_t test;

// pseudocode
int main()
{
   DUMP(test);
}

在此处运行:http://www.compileonline.com/compile_c_online.php

来源:https://stackoverflow.com/a/1623148/2591612

答案 1 :(得分:2)

您可以使用stringize运算符并为变量名定义打印函数以及变量声明:

#include <stdio.h>

/* This declares a variable name together with a function print_name */
#define declarePrintable(type, name) int print_##name() { return printf("%s", #name); } struct type name

struct someType
{
    int i;
};

declarePrintable(someType, someName);

int main()
{
    someName.i = 3; 
    print_someName(); 
    printf(".i is %d ", someName.i );
}

答案 2 :(得分:2)

你可以使用这样的东西来声明你的结构,首先你需要一些定义如下的宏:

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

然后你可以在你的程序中执行以下操作,所有声明的结构将具有&#34; __ name&#34;您可以随时访问的成员:

   int main()
   {
       someName_t mySomeInstance;
       init_someName( &mySomeInstance );
       printf( mySomeInstance->__name );
       return 0;
   }

但是,除非您根据添加到结构中的元数据的指标和其他问题开发了大量函数来提供安全性,否则这非常容易出错。在C ++中,你可以做类似的事情,但是利用函数重载和模板,这使得这种技术比在C中更有意义。

顺便说一句,我没有测试过这个特殊的代码,我匆匆写了它,所以它可能无法按预期工作:)

答案 3 :(得分:0)

不,这是不可能的。

对象名称仅以源格式存在。编译程序后,不再存在对象名称。

但是,你当然可以打印一个字符串

printf("%s\n", "test");

由于staticx建议您可以使用预处理器根据对象名称创建字符串并打印该字符串。

答案 4 :(得分:-1)

通过编译任何C代码创建的目标代码将不包含任何包含任何变量或变量类型名称的文字字符串,除非在编译代码中创建调试信息,或者您有意创建此类文字字符串你的源代码。您嵌入的任何文字字符串都需要维护才能与重构代码或新变量保持同步。 Ergo ,您无法打印这些变量名称。即使在目标代码中内置了调试选项,文字字符串仍然无法用于代码本身;只有调试器知道如何使用它们。您似乎想要某种在运行时查看变量名称的自动方式。也许您可以通过使用调试器或解释您真正想要做的事情来获得更好的服务。