【发布时间】:2014-05-19 01:31:03
【问题描述】:
我很难理解为什么以下代码(具有标准布局的 UDT)会在 Visual C++ 2012 中给出 C 链接警告:
warning C4190: 'vec3_add' has C-linkage specified, but returns UDT 'vec3' which is incompatible with C
typedef struct vec3 {
float x;
float y;
float z;
#ifdef __cplusplus
vec3(float x, float y, float z) : x(x), y(y), z(z) {}
#endif
} vec3;
#ifdef __cplusplus
extern "C" {
#endif
vec3 vec3_add(vec3 a, vec3 b);
#ifdef __cplusplus
}
函数的定义在一个C++文件中:
vec3
vec3_add(vec3 a, vec3 b) {
static_assert(std::is_standard_layout<vec3>::value == true, "incompatible vec3 type");
return vec3(a.x + b.x, a.y + b.y, a.z + b.z);
}
【问题讨论】:
-
编译器显然对构造函数有反应。也许它(有点自相矛盾)可以帮助添加一个默认构造函数。我不会对
is_standard_layout报告的内容过于重视。这些东西在最初的 Boost 实现中通常是假的,可能没有正确实现或“真正”实现。 -
请注意,通过将编译器版本提高一个档次,您将获得对花括号初始化的支持,其中构造函数提供的便利很少。对于您当前的编译器,您可以将构造函数替换为内联对象工厂函数。
-
从类的定义来看确实是一个标准的布局类。问题是它应该是 POD 类型吗? - POD 是简单而标准的布局。