C中的结构编译器问题

Struct compiler problems in C

本文关键字:编译器 问题 结构      更新时间:2023-10-16

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

到目前为止发布的其他解决方案存在一个问题,即您无法在混合了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

假设类型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;

您无法获得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++中都需要equal和not equal运算符,我建议您从结构中删除运算符定义,并编写一个实现SomeNameEqualsSomeNameNotEquals函数的纯c接口。