9
typedef int A;
typedef int B;

void foo(A arg){}

void main(void){
    B wrongvar = 7;
    foo(wrongvar);
}

根据标准,这种结构是否应该返回警告/错误?最流行的编译器呢?

例子:我们有变量,代表公斤和米,都是'int'类型。我们有一个功能,处理米。我们希望编译器能够捕获错误,这些错误与将公斤表示的变量变量传递给该函数有关。

我相信艾达处理得很好。现代C呢?

4

2 回答 2

9

不,您正在处理的是一个类型学科问题,称为结构等效与名称等效。正如 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描述如何帮助避免这些命名约定问题

于 2013-04-28T16:17:53.460 回答
2

您可以使用带有一个字段的结构来完全按照您的意愿进行操作。唯一的“缺点”是如果优化器不优化它们,你可能会浪费 1/2/4/8 字节......

于 2013-04-05T12:03:59.780 回答