printf for struct?(C/C++,VC2008)

k06*_*06a 5 c++ printf struct field

只需在VC2008中构建并运行它:

struct A
{
   int a;
   int b;
   int c;
};
A a = { 10, 20, 30 };
printf("%d %d %d\n", a);
Run Code Online (Sandbox Code Playgroud)

这是正常的吗?

10 20 30
Run Code Online (Sandbox Code Playgroud)

我想投!但它不起作用:

struct A
{
   int a;
   int b;
   int c;
   operator int()
   {
      return a + b + c;
   }
};
A a = { 10, 20, 30 };
printf("%d\n", a);
Run Code Online (Sandbox Code Playgroud)

仅输出:

10
Run Code Online (Sandbox Code Playgroud)

我需要自动转换模板实用程序.这是:https://code.google.com/p/boolib/source/browse/boolib/crypt/ShakedValue.h 它应该隐藏在内存中,任何hack-programms(ArtMoney)都找不到值.

还有一个技巧:打印struct/class的私有成员

Bli*_*ndy 10

如果你想要一个演员,然后施放它:

struct A
{
   int a;
   int b;
   int c;
   operator int()
   {
      return a + b + c;
   }
};
A a = { 10, 20, 30 };
printf("%d\n", (int)a);
Run Code Online (Sandbox Code Playgroud)

输出将是

60
Run Code Online (Sandbox Code Playgroud)

  • @ k06a,你永远不会得到它,所以开始寻找替代方案,比如拥有一个模板成员函数`template T toT <T>(){return(T)this; }或类似的东西. (2认同)

Fre*_*Foo 5

它是未定义的行为,因此在某种意义上,对于此函数调用,每个可能的行为都可以称为"正常".但可以解释一下.

printf在格式字符串后接受可变数量的参数.如何打包这些是留给实现的.似乎Visual C++在内存中打包参数的方式与打包成员的方式相同struct A,因此每次在va_arg内部调用时,它都会获取下一个元素a.

关于转换,您不能依赖于varargs上下文中的自动转储,因为可选参数没有类型.printf被宣布为int printf(char const *, ...)....是一系列无类型参数.

  • 这里是MSDN(http://msdn.microsoft.com/en-us/library/wc7014hz.aspx)的链接,它明确指出:"如果所有格式规范都没有足够的参数,则结果是未定义的". (2认同)
  • @ k06a:使用I/O流. (2认同)

Jen*_*edt 5

没有像C/C++这样的东西,你的代码只是两者的混合.特别是它不能使用标准C编译器进行编译,因为您struct在声明中缺少关键字a.

供您使用printf.首先,如果这是C++,你不应该这样做.它有自己的IO机制.使用它们.

然后将结构作为参数放在...列表中是未定义的行为.你运气不好,编译器做了它做的事情.它可能只是悲伤的"不,不,不这样做",或者至少给了你一个警告.