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)
它是未定义的行为,因此在某种意义上,对于此函数调用,每个可能的行为都可以称为"正常".但可以解释一下.
printf在格式字符串后接受可变数量的参数.如何打包这些是留给实现的.似乎Visual C++在内存中打包参数的方式与打包成员的方式相同struct A,因此每次在va_arg内部调用时,它都会获取下一个元素a.
关于转换,您不能依赖于varargs上下文中的自动转储,因为可选参数没有类型.printf被宣布为int printf(char const *, ...)....是一系列无类型参数.
没有像C/C++这样的东西,你的代码只是两者的混合.特别是它不能使用标准C编译器进行编译,因为您struct在声明中缺少关键字a.
供您使用printf.首先,如果这是C++,你不应该这样做.它有自己的IO机制.使用它们.
然后将结构作为参数放在...列表中是未定义的行为.你运气不好,编译器做了它做的事情.它可能只是悲伤的"不,不,不这样做",或者至少给了你一个警告.