C 指向long的指针的显式强制转换

C 指向long的指针的显式强制转换,c,pointers,C,Pointers,我需要将指针强制转换为long-long,并且更愿意以gcc不会在32位或64位体系结构上抱怨将指针转换为不同大小的int的方式进行转换。在任何人询问之前,是的,我知道我在做什么,我知道我在做什么——我的特定用例是希望在应用程序出错时通过网络发送堆栈跟踪(指针本身就是主题),因此不能保证发送方和接收方的字大小相同。因此,我构建了一个包含消息数据的结构,其中包含一个“unsigned long long”值数组(保证最小64位)来保存指针。是的,我知道“long-long”不能保证只有64位,但我

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

我曾考虑过匿名联盟的技巧,但这对我来说有点太粗糙了……我希望有一种方法可以在C99中使用双重施法或其他方法来实现这一点(因为匿名联盟直到C11才成为标准)

编辑:

typedef结构错误\u msg\t{
int-msgid;
内伦;
pid_t pid;
int-si_码;
内信号;
int errno;
无符号长堆栈[20];
char err_msg[];
}错误消息;
...
空**栈;
...
msg.msgid=错误消息;
msg.len=sizeof(error_msg_t)+strlen(err_msg)+1;
msg.pid=getpid();
...

对于(i=0;i可能您最好的选择是双重强制转换,以便向编译器解释您要执行的操作()

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

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

<代码> UTIN 64×T/代码>将是一个更好的选择。(UTIN 64)T(UTITPPTRT)堆栈(1)删除警告吗?<代码> uTuntLeAST464×会更好,因为<代码> UTIN 64×T/<代码>是可选类型。您可以考虑发送<代码> PROTF(“%P”,PTR)的输出吗?
而不是整数值?
uint\u least64\u t
更糟糕。问题是关于精确64位的整数,并且仅限于支持该整数的平台。对于平台来说,获取错误是有益的,这是不容易支持的。不要对你能做的进行宏
静态内联
@Rhymoid:我觉得在这里宏是一个更好的选择,b因为虽然您希望代码可读,但您仍然希望传递一种观念,即某些古怪的事情正在发生。
#define PTR_TO_UINT64(x) (uint64_t)(uintptr_t)(x)