Структурировать проблемы компилятора в C

0

В файл.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
    Какую ошибку вы получаете при включении его в .c файл?
  • 7
    C не поддерживает перегрузку операторов, поэтому вы не можете перенести этот код без потери функциональности.
Показать ещё 5 комментариев
Теги:

3 ответа

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
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++, я предлагаю удалить определения оператора из структуры и написать чистый c-интерфейс, реализующий функцию SomeNameEquals и SomeNameNotEquals.

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
    Это устраняет предполагаемое ограничение, что вы хотите иметь возможность включать один и тот же заголовок в источники C ++ и источники C, без потери функциональности на стороне C ++. Если вам нигде не нужны перегруженные операторы (например, если вам нужен заголовок только в C), то вы можете просто удалить перегрузки операторов.
  • 1
    Обратите внимание, что у вас не должно быть проекта, в котором это определение компилируется как C в одном месте и как C ++ в другом месте, потому что это нарушает правило одного определения для SomeName . Поэтому я бы предложил не делать этого вообще.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню