【问题标题】:Is it safe to pass int using XtPointer?使用 XtPointer 传递 int 是否安全?
【发布时间】:2009-12-11 14:26:48
【问题描述】:

在 Xt 中定义回调过程(例如 XtTimerCallbackProc)时,client_data 被指定为 XtPointer。通过 client_data 而不是实际指针传递 int 并将其强制转换回过程中是否安全?

例如:

void foo(void) {
   ...
   int data = 1;
   XtAppAddTimeout(app_context, 1000, timer_cb, data);
   ...
}

void timer_cb(XtPointer client_data, XtIntervalId *timer)
{
   int my_data = (int) client_data;
   ...
}

【问题讨论】:

    标签: c motif


    【解决方案1】:

    是的; API 使用指针,因为在几乎任何计算机/编译器组合上,这种类型的大小 >= int 的大小,因此您可以使用它来传递除 double 之外的大多数内容,只需通过强制转换即可。

    【讨论】:

    • 我相信 sizeof(long) == sizeof(void *) 对于 GCC 支持的每个 ABI。
    【解决方案2】:

    应该是安全的,但你应该使用与指针大小相同的整数类型。

    标准 C99 类型 uintptr_t 可用于此目的。

    根据 cmets 指出,使用这种类型不能保证 int->ptr->int。它应该比经常工作,但它不符合规范。

    另一种方法是传递一个指针。如果你的应用是单线程的,你可以这样做

    静态整数数据;并传递 &data。如果您的应用需要可重入,则 malloc 一个 int。

    事实上,我认为标准不以任何方式支持 int->ptr->int。

    【讨论】:

    • 发现于#include <inttypes.h>,以防OP不知道。
    • 根据我的阅读,uintptr_t 保证适用于 ptr->int->ptr,但不一定适用于 int->ptr->int。所以简短的回答似乎是否定的,没有便携的方式。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多