【发布时间】:2014-11-25 13:21:32
【问题描述】:
我发现自己处于以下情况:
#include <stdio.h>
typedef struct T1 { int id; } T1;
typedef struct T2 { int id; } T2;
void f(T1 *ptr) { printf("f called\n"); }
int main(void)
{
T2 obj;
T2 *ptr = &obj;
f(ptr); // shouldn't this be a compilation error ?
return 0;
}
当然,这是无效的 C++,但在 C 中,程序 prints "f called"。这如何有效?
编辑
(以防万一不清楚)如果T2“结构上”不同,该程序仍将运行compile并运行,例如
typedef struct T2 { double cc[23]; } T2;
【问题讨论】:
-
如果您使用将警告视为错误的设置进行编译,则代码不会编译 (link)。
-
有趣。您是否尝试过两种真正不同的结构?
-
一些编译器只对实际错误发出警告。
-
@gasher729:是的,C 标准允许这样做。对于任何违反语法规则或约束的程序,它只需要至少一次诊断(可以是非致命警告)。编译器要求拒绝翻译单元的唯一情况是当它包含在预处理后仍然存在的
#error指令时。
标签: c pointers implicit-conversion