指向long long的显式转换

时间:2016-10-18 19:31:11

标签: c pointers

我需要将指针强制转换为long long,并且更愿意以gcc不会抱怨32位或64位架构关于将指针转换为不同大小的int的方式来执行此操作。在任何人问之前,是的,我知道我在做什么,而且我知道我正在做什么 - 我的具体用例是想通过网络发送堆栈跟踪(指针本身就是这里的主题)发生应用程序错误,因此无法保证发送方和接收方具有相同的字大小。因此,我构建了一个包含消息数据的结构,其中包含一个“无符号长long”数组(保证最小64位)以保存指针。是的,我知道“long long”不是保证只 64位,但是我用于源和目标的所有编译器都将它实现为64-位。因为带有结构的头(和源)将在两种体系结构上使用,“uintptr_t”似乎不是一个可行的解决方案(因为,根据stdint.h中的定义,它的大小取决于体系结构)。

我想过跟匿名工会变得棘手,但这对我来说感觉有些过于苛刻......我希望有一种方法可以用一些双重魔法或在C99中做到这一点(因为匿名工会不是'标准直到C11)。

编辑:

typedef struct error_msg_t {
  int msgid;
  int len;
  pid_t pid;
  int si_code;
  int signum;
  int errno;
  unsigned long long stack[20];
  char err_msg[];
} error_msg_t;
...
void **stack;
...
msg.msgid = ERROR_MSG;
msg.len = sizeof(error_msg_t) + strlen(err_msg) + 1);
msg.pid = getpid();
...
for (i=0; i<stack_depth; i++)
  msg.stack[i] = (unsigned long long)stack[i];

警告(在32位编译时)关于在最后一行上转换为不同大小的整数。

1 个答案:

答案 0 :(得分:1)

可能你最好的选择是将双重拼版拼写为编译器你想要做的事情(as suggested by Max)。

我建议将其包装到宏中,以便从宏名称中清除代码意图。

#define PTR_TO_UINT64(x) (uint64_t)(uintptr_t)(x)