typedef int A;
typedef int B;
void foo(A arg){}
void main(void){
B wrongvar = 7;
foo(wrongvar);
}
根据标准,这种结构是否应该返回警告/错误?那些最流行的编译器呢?
示例:我们有变量,代表千克和米,所有都是'int'类型。我们有一个功能,加工米。我们希望编译器能够捕获错误,这些错误与将千克意味着变量变量传递给该函数有关。
我相信 Ada 可以顺利处理。现代C怎么样?
答案 0 :(得分:7)
不,你正在处理的是类型纪律问题,称为结构等价与名称等价。正如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;
}
您可能希望阅读这篇文章:http://www.joelonsoftware.com/articles/Wrong.html描述如何通过命名约定来帮助避免这些问题
答案 1 :(得分:2)
您可以使用包含一个字段的结构来完全按照您的意愿执行操作。唯一的“缺点”是,如果优化器没有优化它们,你可能会浪费1/2/4/8字节......