C中的结构编译器问题

时间:2014-10-08 21:29:03

标签: c++ c

以下内容可以包含在.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文件中包含它?

3 个答案:

答案 0 :(得分:1)

假设类型UserIdUserInstance的声明在范围内,您应该能够写下:

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 ++中,我建议你从结构中删除运算符定义,并编写一个实现SomeNameEqualsSomeNameNotEquals函数的纯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