【发布时间】:2011-12-11 05:40:31
【问题描述】:
我正在调试一些涉及指向成员字段的指针的代码,我决定将它们打印出来以查看它们的值。我有一个函数返回一个指向成员的指针:
#include <stdio.h>
struct test {int x, y, z;};
typedef int test::*ptr_to_member;
ptr_to_member select(int what)
{
switch (what) {
case 0: return &test::x;
case 1: return &test::y;
case 2: return &test::z;
default: return NULL;
}
}
我尝试使用cout:
#include <iostream>
int main()
{
std::cout << select(0) << " and " << select(3) << '\n';
}
我收到了1 and 0。我以为数字表示struct 内的字段位置(即1 是y 而0 是x),但不,打印的值实际上是1 非空指针和0 为空指针。我想这是一种符合标准的行为(即使它没有帮助)——我说的对吗?此外,兼容的 c++ 实现是否可以始终为指向成员的指针打印 0?甚至是一个空字符串?
最后,我怎样才能以有意义的方式打印指向成员的指针?我想出了两个丑陋的方法:
printf("%d and %d\n", select(0), select(3)); // not 64-bit-compatible, i guess?
ptr_to_member temp1 = select(0); // have to declare temporary variables
ptr_to_member temp2 = select(3);
std::cout << *(int*)&temp1 << " and " << *(int*)&temp2 << '\n'; // UGLY!
还有更好的方法吗?
【问题讨论】:
-
发布您的代码,这甚至无法编译。
标签: c++ printf standards-compliance pointer-to-member