C 如何在不影响性能的情况下实现基本类型的类型安全性?

C 如何在不影响性能的情况下实现基本类型的类型安全性?,c,compiler-errors,type-safety,C,Compiler Errors,Type Safety,我希望c编译器检查简单类型的使用情况。我的首选用法是检查typedefs,但即使使用-Wall和-Wextra也无法做到这一点: #include <math.h> #include <stdio.h> typedef float deg; typedef float rad; float sinus( rad angle ) { return sin( angle ); } int main() { deg a = 180; printf(

我希望c编译器检查简单类型的使用情况。我的首选用法是检查
typedef
s,但即使使用
-Wall
-Wextra
也无法做到这一点:

#include <math.h>
#include <stdio.h>

typedef float deg;
typedef float rad;

float sinus( rad angle ) {
    return sin( angle );
}

int main() {
    deg a = 180;
    printf( "The sinus of %g is %g\n", a, sinus(a));
    return 0;
}
#包括
#包括
typedef-float-deg;
typedef-float-rad;
浮动窦(弧度角){
返回sin(角度);
}
int main(){
a度=180;
printf(“%g的窦是%g\n”,a,窦(a));
返回0;
}
这样编译起来很顺利

因此,我正在考虑使用单成员结构:

#include <math.h>
#include <stdio.h>

typedef struct { float value; } deg;
typedef struct { float value; } rad;

float sinus( rad angle ) {
    return sin( angle.value );
}

int main() {
    deg a = {.value=180};
    printf( "The sinus of %g is %g\n", a, sinus(a));
    return 0;
}
#包括
#包括
typedef结构{float value;}deg;
typedef结构{float value;}rad;
浮动窦(弧度角){
返回sin(角度值);
}
int main(){
度数a={.value=180};
printf(“%g的窦是%g\n”,a,窦(a));
返回0;
}
这会产生一个明显的错误(应该是这样的)。然而,我想知道的性能。如果我纠正上述示例,生成的二进制文件大小相同,无论是否经过优化。但是,所生成的部件不同。即使在更复杂的上下文中,编译器能否优化结构?如果没有,是否有其他方法可以实现基本类型的类型安全性

<>我使用的是GCC(91.0),但是如果有帮助的话,我会考虑LLVM。这应该适用于常见的桌面架构,即x86、x86_64、ARM

编辑:我注意到在上面的示例中,您也可以使用
union
而不是
struct
。这同样会产生稍微不同的汇编代码,我也不清楚真实世界的性能后果

我希望c编译器检查简单类型的使用情况。我的首选用法是检查typedefs,但这还没有完成

最近的一个可能的方法是在typedef(或
#pragma
-s)上添加额外的
\uuu属性
,并在执行检查时编写自己的代码(可能同时使用和技术)

请注意,您想要的功能超出了标准C的语义范围,如中所定义

如果允许(并获得资金),我可能(在2021年春季)扩展静态分析器(在本报告中描述)以实现您的目标。另请参见和项目。给我发电子邮件到
basile。starynkevitch@cea.fr
了解更多信息

另一种方法是设计自己的编程语言,并编写编译器。那么会议是相关的

或者根据您的需要进行调整或调整

在所有情况下,预算数个月的专业软件工程师劳动力。意识到

你梦寐以求的检查可以部分自动化,但需要昂贵的开发。 你的问题是:以米为单位的距离除以以秒为单位的持续时间,就得到了速度。以及单位(角度可以是弧度和度)


IIRC,一些航天器因此类错误而丢失。

这在很大程度上取决于编译器目标体系结构的ABI。x86-64与ARM-64位不同。这还取决于您的编译选项。最近,您是否尝试编译并链接了
gcc-Wall-Wextra-O3-flto
?我使用的是gcc 9.1.0,其中
-Wextra
没有帮助。GCC 10的更改日志没有提到typedefs的警告。如果你给我发电子邮件,请给出一些预算。我的意见是,至少需要5万欧元,也许需要3倍以上。但我现在正在度假,可能会大错特错。我意识到标准C不需要这个检查(尽管我不明白为什么这个功能不应该至少有一个
strict typedef
),但这就是编译器选项的用途,不是吗?考虑到C标准化进程有助于将这些特性推向未来的标准,这对Joe C. Random来说是可行的吗?这取决于你的教育和你的软件工程技能。