В файл.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
Вы не можете получить точную функциональность структуры 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++, я предлагаю удалить определения оператора из структуры и написать чистый c-интерфейс, реализующий функцию SomeNameEquals
и SomeNameNotEquals
.
Предполагая, что объявления типов 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;
SomeName
. Поэтому я бы предложил не делать этого вообще.