违反严格确定规则的演员
-
04-10-2019 - |
题
我有一个函数,该函数需要长期*,并且需要将其传递给使用无符号int*的外部库,并且在此平台上,unsigned 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 ++中这样做。
解决方案
void UpdateVar(unsigned long* var) {
unsigned int x = static_cast<unsigned int>(*var);
ExternalLibUpdateVar(&x);
*var = static_cast<unsigned long>(x);
}
其他提示
这应该有效:
void UpdateVar(unsigned long* var) {
// this function will change the value at the address of var
ExternalLibUpdateVar(reinterpret_cast<unsigned int*>(var));
}
C标准任务中没有任何内容 int
和 long
必须具有相同的尺寸;此外,即使它们确实具有相同的大小,标准任务中也没有任何相同表示形式(除其他事项外,它们都可能具有不兼容的填充钻头和陷阱代表的组合,因此两种类型之间的混音不能服务于任何有用的目的)。
标准的作者不想强迫实施者针对平台 int
和 long
将无目的地认识到这种混溶。他们也不想编写适用于某些平台的规则(这些平台的规则(这些平台都可以达到目的),而不是其他平台(那些不辨认的那些平台)。取而代之的是,他们认为写作高质量编译器的人们会试图在有用的情况下识别混叠。
能够使用指针到一种32位类型来读取和写入具有相同表示形式的另一种32位类型的值显然很有用,尤其是如果API分配给他们期望的哪种类型。如果平台上的某些常见的API使用 int*
对于32位值,其他值使用 long*
, , 一种 质量 该平台的通用实现必须允许使用其他指针访问任何一种类型的数据。
但是,不幸的是,某些编译器的作者对快速处理某个子集的作者比有可能处理更大的程序集更感兴趣,并且如果有必要在使用的API之间交换数据,则不能依靠来生成有用的代码。相同的数据表示,但命名类型不同,除非一个完全禁用混叠分析。当然,如果一个针对适合在微控制器上通用使用的C的方言,那么这些问题就无关紧要。
不隶属于 StackOverflow