以下内容可以包含在.cpp文件中,编译器不会抱怨它。
typedef struct _SomeName {
char NameID[MaxSize];
UserId notUsed;
UserInstance instance;
bool operator==(const struct _SomeName& rhs) const
{
return (strncmp(NameID, rhs.NameID, MaxSize) == 0);
}
bool operator!=(const struct _SomeName& rhs) const { return !(*this == rhs); };
} SomeName;
如何重写上述内容,以便可以从.c文件中包含它?
答案 0 :(得分:1)
假设类型UserId
和UserInstance
的声明在范围内,您应该能够写下:
typedef struct _SomeName {
char NameID[MaxSize];
UserId notUsed;
UserInstance instance;
#ifdef __cplusplus
bool operator==(const struct _SomeName& rhs) const
{
return (strncmp(NameID, rhs.NameID, MaxSize) == 0);
}
bool operator!=(const struct _SomeName& rhs) const { return !(*this == rhs); };
#endif
} SomeName;
答案 1 :(得分:1)
你无法获得c ++结构的确切功能,但如果使用__cplusplus
条件,则可以省略部分,C编译器将无法编译。
typedef struct _SomeName {
char NameID[MaxSize];
UserId notUsed;
UserInstance instance;
#ifdef __cplusplus
bool operator==(const struct _SomeName& rhs) const
{
return (strncmp(NameID, rhs.NameID, MaxSize) == 0);
}
bool operator!=(const struct _SomeName& rhs) const { return !(*this == rhs); };
#endif
} SomeName;
如果你需要等于和不等于运算符,在c和c ++中,我建议你从结构中删除运算符定义,并编写一个实现SomeNameEquals
和SomeNameNotEquals
函数的纯c接口
答案 2 :(得分:1)
到目前为止发布的其他解决方案存在一个问题,即您无法在混合使用C和C ++的项目中使用它。我猜你的问题可能是你想要做的。如果您尝试这样做,您可能会获得静默未定义的行为,因为结构可能在不同的翻译单元中具有不同的布局。
我建议这个版本:
typedef struct
{
char NameID[MaxSize];
UserId notUsed;
UserInstance instance;
} SomeName;
#ifdef __cplusplus
inline bool operator==( SomeName const &lhs, SomeName const &rhs )
{
return strcmp(lhs.NameID, rhs.NameID) == 0;
}
inline bool operator!=( SomeName const &lhs, SomeName const &rhs )
{
return !operator==( lhs, rhs );
}
#endif