2014-10-08 2 views
0

В файл .cpp может быть включено следующее. Компилятор не будет жаловаться на это.Проблемы с компилятором Struct в C

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 не поддерживает перегрузку оператора, поэтому вы не можете переносить этот код без потери функциональности. –

+2

c не поддерживает перегрузку оператора. так что это невозможно. –

ответ

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

Предположив, что декларации типов 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'. Поэтому я бы предложил не делать этого вообще. –

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; 

Если вам нужен равный и не равный оператору, как в С и С ++, я предлагаю вам удалить определения оператора из структуры, и написать чистый интерфейс, реализующий гр функцию SomeNameEquals и SomeNameNotEquals.

Смежные вопросы