C语言 允许 ((int *)p)++ 的任何 gcc 选项



一些C编译器有时可以将强制转换的指针推断为左值,但gcc默认值不会编译它。而不必(通过容易出现人为错误的方式(将遗留代码库移植到:

p=(int *)p+1 ; /* increment by sizeof(int) */

GCC可以允许下面的代码吗(即使技术上不正确(?

void f() {
void *p ; /* type to be cast later for size */
((int *)p)++ ; /* gcc -c f.c => lvalue required error */ }

编辑:即使技术上不正确,我认为程序员对此类代码的唯一意图是让p保持左值并"递增"它,生成与我的长格式相同的代码,对吧?(永久标记为"左值演员表"(

编辑2:我们都同意重构到 std C 是最好的,但如果像Mateo-fpermissive这样的东西有效,它可能不会发现未来的编程错误,但希望最初的gcc 移植工作会减少错误......还有其他类似的建议吗?

如果你想清理你的代码(删除过多的强制转换(,你可以将丑陋的强制转换集中在宏中,或者更好的是,内联函数中。 下面的片段仅使用隐强制转换到/从void*

当然,您仍然负责正确的对齐。


#include <stdio.h>
static void *increment(void * p,size_t offset)
{
char *tmp = p;
return tmp+offset;
}
int main(void)
{
void *ptr = "Hell0 world!n";
ptr = increment( ptr, sizeof(int) );
printf("%s", (char*) ptr);
return 0;
}

相关内容

最新更新