我有一个函数,它接受一个无符号的long*,并且需要将它传递给一个接受无符号int*的外部库,在这个平台上,无符号int/long的大小是相同的。
void UpdateVar(unsigned long* var) {
// this function will change the value at the address of var
ExternalLibAtomicUpdateVar((unsigned int*)var); // lib atomically updates variable
}这会生成一个警告,说明它违反了严格别名规则。有什么变通的办法吗?
谢谢
编辑:我为我没有讲清楚而道歉。代码是原子更新,所以不能在库中到处去存储它。我可以下拉到汇编,但我想在C++中这样做。
发布于 2010-09-22 03:44:14
void UpdateVar(unsigned long* var) {
unsigned int x = static_cast<unsigned int>(*var);
ExternalLibUpdateVar(&x);
*var = static_cast<unsigned long>(x);
}发布于 2010-09-22 03:43:40
这应该是可行的:
void UpdateVar(unsigned long* var) {
// this function will change the value at the address of var
ExternalLibUpdateVar(reinterpret_cast<unsigned int*>(var));
}发布于 2016-08-20 04:19:49
C标准中没有规定int和long必须具有相同的大小;此外,即使它们具有相同的大小,标准中也没有要求它们具有相同的表示形式(尤其是,它们可能具有不兼容的填充比特和陷阱表示形式的组合,使得两种类型之间的混叠不能用于任何有用的目的)。
标准的作者不想强迫实现者瞄准这样的平台,在这些平台上,int和long之间的混叠将不会起到识别这种混叠的作用。他们也不想写出适用于某些平台的规则(别名会起作用的平台),而不是其他平台(别名不起作用的平台)。相反,他们认为编写高质量编译器的人会试图在别名有用的情况下识别它。
能够使用指向一种32位类型的指针来读取和写入另一种具有相同表示形式的32位类型的值,这显然很有用,特别是如果API对它们所需的类型进行了拆分。如果平台上一些常见的API使用32位值的int*,而其他API使用long*,那么该平台的高质量通用实现必须允许使用另一种类型的指针来访问这两种类型的数据。
然而,不幸的是,一些编译器的作者更感兴趣的是快速处理程序的某个子集,而不是有效地处理更大的程序子集,如果需要在使用相同数据表示但不同命名类型的API之间交换数据,则不能依赖它们来生成有用的代码,除非完全禁用别名分析。当然,如果目标是适合微控制器上通用用途的C语言,那么这些问题都无关紧要。
https://stackoverflow.com/questions/3763828
复制相似问题