有些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
保持左值并“增加”它,生成与我的长格式相同的代码,对吧? ( perreal 标记为“左倾投射”)
Edit2:我们都同意对std C进行重构是最好的,但如果 Mateo 的-fpermissive
之类的东西有效,它可能无法捕获未来的编程错误,但希望初始化 gcc移植工作会减少错误...还有其他类似的建议吗?
答案 0 :(得分:1)
如果你想清理你的代码(删除过多的强制转换),你可以将丑陋的强化转换集中在宏中,或者更好的是内联函数。
以下片段仅使用隐式强制转换为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;
}