使用'typedef'确保逻辑类型安全

Vor*_*rac 8 c c99 avr-gcc

typedef int A;
typedef int B;

void foo(A arg){}

void main(void){
    B wrongvar = 7;
    foo(wrongvar);
}
Run Code Online (Sandbox Code Playgroud)

根据标准,这种结构是否应该返回警告/错误?那些最受欢迎的编译器呢?

示例:我们有变量,代表公斤和米,所有都是'int'类型.我们有一个功能,加工米.我们希望编译器能够捕获错误,这些错误与将千克意味着变量变量传递给该函数有关.

我相信Ada能顺利处理.现代C怎么样?

Rya*_*ing 8

不,你正在处理的是类型学科问题,称为结构等价与名称对等.正如Dog所说,你可以做的最接近你想要的就是使用结构,但如果编译器选择添加填充(在这种情况下不太可能),这可能会浪费内存.C对于别名使用结构等价(意味着两种类型是相同的),但是对于不同的声明的结构使用名称等价(具有相同布局的两种结构类型不被视为等效).

使用结构来执行此操作的示例:

typedef struct {
    double value;
} meters;

typedef struct {
    double value;
} kilograms;

int main(){
    meters m;
    kilograms k = {2}; // initialized
    m.value = 1;
    k = m; // error, can't assign meters to kilos
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可能希望阅读这篇文章:http://www.joelonsoftware.com/articles/Wrong.html,描述如何通过命名约定来帮助避免这些问题

  • POSIX保留类型名称的`_t`后缀.由于类型与变量存在于单独的命名空间中,因此无论如何都没有理由使用不同的后缀.http://stackoverflow.com/a/231807/139746 (2认同)