限制-edness具有预C99
-
12-09-2019 - |
题
考虑到这种代码,VC9不检测混叠:
typedef struct { int x, y; } vec_t;
void rotate_cw(vec_t const *from,
vec_t *to)
{
/* Notice x depends on y and vice versa */
to->x = from->y;
to->y = -from->x;
}
/* ... */
vec_t a, b;
rotate_cw(&a, &b); /* OK, no aliasing */
rotate_cw(&a, &a); /* FAIL, aliasing is not detected */
显而易见的解决方法是使用一个临时:
void rotate_cw(vec_t const *from,
vec_t *to)
{
int temp = from->x;
to->x = from->y;
to->y = -temp;
}
这是标准的行为吗?我期待的是,编译器,除非告诉所以,将承担的两个强>指针被可能混叠
解决方案
尝试把 __restrict 中的参数之前,似乎是发现越来越MSVC得到任何警告的唯一途径任何人。
其他提示
如编写的代码是完全有效的,在C89或C99。它是模糊的,但并没有什么编译器来诊断,所以也没有确诊。
如果您使用的C99和“限制”在功能上的两个参数,那么你会得到一个错误 - 如果你的编译器支持C99。 AFAIK,MSVC的没有当前版本还支持C99充分。
在C99发明了restrict
预选赛中,一些C编译器包含这将引导他们做出指针使用某些假设的优化选项;我已经看到了这样的编译器的说明书明确警告说,这样的优化是不的符合标准,并使用某些特定的构建体,其行为是由标准定义的,其中是一个方式工作可以任意导致代码相反到标准和程序员的意图。但从本手册来看,优化告诉编译器来编译C的一个子集,它并没有定义在C下定义的某个角落的情况下的行为,而这将允许更高效的代码生成的那些情况下,没有限定。
不隶属于 StackOverflow