提领类型双关的指针将破坏强重叠规则

最近复习C/C++,今日用APR编写了一个生产/消费模型的小程序。结果出现了这样一个奇怪的警告:“提领类型双关的指针将破坏强重叠规则”,让我大惑不解,特此和大家讨论一下。

我用的是gcc 版本 4.2.3 (Ubuntu 4.2.3-2ubuntu7) 线程模型:posix。出现警告的这段是这样的:

    apr_queue_t *queue = (apr_queue_t *) data;
    int *d = NULL;
    while(1){
        apr_queue_pop(queue, (void **)(&d)); // -- 此处为出现警告的地方。
        printf("Consumed: %d\n", *d);
    }

虽然可以运行无误,但该警告还是让我比较无奈,最后我改成了如下:

    apr_queue_t *queue = (apr_queue_t *) data;
    int *d = NULL;
    void *c = NULL;
    while(1){
        apr_queue_pop(queue, &c);
        d = (int *)c;
        printf("Consumed: %d\n", *d);
    }

因为很久没有写C,在这里,我的问题是:

  1. 什么叫做“提领类型双关的指针”?
  2. 什么是“强重叠规则”?
  3. 为什么会破坏?
  4. 破坏之后会引发什么问题?

希望有C/C++达人能解决我这些疑问,谢谢。

附源代码:main.c

6 Comments

  1. Awaken
    2008年07月22日 at 5:38 下午 #

    Awaken????


  2. Awaken
    2008年07月22日 at 5:38 下午 #

    Awaken前来瞻仰


  3. Awaken
    2008年07月22日 at 5:40 下午 #

    呃,下面那个防spam的,实在太难认了,而且,一次认错了评论框里的中文就变成????了


  4. ShiningRay
    2008年07月22日 at 5:54 下午 #

    没办法,垃圾实在太多,我先暂时去掉看看效果


  5. WindyWinter
    2009年11月19日 at 12:11 下午 #

    “提领”是一个词,“类型双关”是一个词。英文原文是dereferencing type-punned pointer will break strict-aliasing rules。
    “强重叠规则”是C99的一个专有名词(这句话里出现的基本上都是专有词或术语),指C99 aliasing rules。
    这里有一个比较详细的解释:http://lists.freebsd.org/pipermail/freebsd-current/2003-July/007561.html


  6. ShiningRay
    2009年11月19日 at 1:31 下午 #

    楼上的看我这篇文章的后面一篇


Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*
loading