Visual C ++ typdef struct проблемы с несколькими определенными символами - PullRequest
1 голос
/ 07 сентября 2011

В Visual C ++ я столкнулся с «фатальной ошибкой LNK1169: обнаружен один или несколько кратно определенных символов» с приведенным ниже кодом. Как я могу решить эту проблему, если я хочу включить оба заголовочных файла в оба источника для использования другими функциями?

main.cpp
========
#include main.h
#include sub.h

sub.cpp
========
#include main.h
#include sub.h

sub.h
=========

typedef struct{
      char colour;
      char name;
}person;

person ssss = { red, ali};

Ответы [ 5 ]

3 голосов
/ 07 сентября 2011

Ваша проблема в том, что вы определяете переменную в заголовочном файле:

person ssss = { red, ali };

Один экземпляр создается в main.cpp, а другой в sub.cpp. Вы бы лучше поставить:

extern person ssss;

В заголовочном файле, а затем определите переменную один раз в одном из исходных файлов. Это позволит обоим исходным файлам знать, что он существует, и оба будут ссылаться на одну и ту же переменную, предполагая, что это то, что вы хотите. Как и в других ответах, я определенно рекомендовал бы также использовать охранники заголовков , хотя в этом примере они вам не нужны, это хорошая практика и в долгосрочной перспективе избавит вас от головной боли.

1 голос
/ 07 сентября 2011

Включение typedef в оба исходных файла не должно быть проблемой.Проблема в том, что объявление ssss появляется через sub.h в обоих файлах.Поместите его в один из исходных файлов и объявите его как внешний в заголовке, чтобы это исправить.Обратите внимание, что у вас была ошибка ссылки, а не ошибка компиляции - это потому, что символ был найден в нескольких объектных файлах.

0 голосов
/ 07 сентября 2011

в sub.h, вставьте в начало файла следующее:

#pragma once
0 голосов
/ 07 сентября 2011
person ssss = { red, ali};

ssss создается один раз в sub.cpp и main.cpp из-за sub.h, включенного в любой из файлов. Инстанциация обычно идет в исходных файлах, а не в заголовочных файлах. Теперь, когда вы обращаетесь к переменным-членам объекта ssss, компоновщик не может получить доступ к какому объекту, потому что они оба используют одну и ту же область видимости.

Решение состоит в том, чтобы иметь один глобальный экземпляр (если это то, что вам нужно), и к нему можно обращаться по разным файлам с помощью внешней связи.

main.cpp
========
#include main.h       // What is main.h required for ?
#include sub.h

extern person ssss;

sub.cpp
========
#include main.h       //  ?!?!
#include sub.h

person ssss = { red, ali};

sub.h
=========

typedef struct{
      char colour;
      char name;
}person;
0 голосов
/ 07 сентября 2011

Вы должны добавить защитные элементы в ваши файлы заголовков, чтобы предотвратить многократное включение одного и того же заголовка.

#ifndef SUB_H
#define SUB_H


//end of file
#endif

Другое дело, почему вы включаете main.h в ваш sub.cpp? Это кажется неправильным.

...