最近复习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,在这里,我的问题是:
- 什么叫做“提领类型双关的指针”?
- 什么是“强重叠规则”?
- 为什么会破坏?
- 破坏之后会引发什么问题?
希望有C/C++达人能解决我这些疑问,谢谢。
附源代码:main.c


6 Comments
Awaken????
Awaken前来瞻仰
呃,下面那个防spam的,实在太难认了,而且,一次认错了评论框里的中文就变成????了
没办法,垃圾实在太多,我先暂时去掉看看效果
“提领”是一个词,“类型双关”是一个词。英文原文是dereferencing type-punned pointer will break strict-aliasing rules。
“强重叠规则”是C99的一个专有名词(这句话里出现的基本上都是专有词或术语),指C99 aliasing rules。
这里有一个比较详细的解释:http://lists.freebsd.org/pipermail/freebsd-current/2003-July/007561.html
楼上的看我这篇文章的后面一篇