Использование struct в другом файле .cpp - PullRequest
10 голосов
/ 30 июля 2011

У меня есть два файла .cpp в одном проекте, main.cpp и myfile.cpp

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

Ответы [ 9 ]

23 голосов
/ 18 августа 2011

Если вы пытаетесь разделить определение структуры среди нескольких модулей компиляции (файлы cpp), общий способ таков: Поместите определение вашей структуры в файл заголовка (mystruct.h) , Если структура содержит какие-либо методы (т.е. это по умолчанию класс со всеми открытыми членами), вы можете реализовать их в файле mystruct.CPP или, если они легковесны, непосредственно в структуре (что делает их встроенный по умолчанию).

mystruct.h:

#ifndef MYSTRUCT_H
#define MYSTRUCT_H

struct MyStruct
{
    int x;
    void f1() { /* Implementation here. */ }
    void f2(); /* Implemented in mystruct.cpp */
};

#endif

mystruct.cpp

#include "mystruct.h"
// Implementation of f2() goes here
void MyStruct::f2() { ... }

Вы можете использовать свою структуру в любом количестве файлов cpp, просто #include mystruct.h:

main.cpp

#include "mystruct.h"
int main()
{
    MyStruct myStruct;
    myStruct.x = 1;
    myStruct.f2();
    // etc...
}

Если, с другой стороны, вы пытаетесь разделить глобальный экземпляр структуры на несколько модулей компиляции (это не совсем понятно из вашего вопроса), сделайте, как указано выше, но также добавьте

extern MyStruct globalStruct;

на mystruct.h. Это объявит, что экземпляр доступен с внешней связью; другими словами, переменная существует, но инициализируется в другом месте (в вашем случае в mystruct.cpp). Добавьте инициализацию глобального экземпляра в mystruct.cpp:

MyStruct globalStruct;

Это важно. Без создания экземпляра globalStruct вручную вы получите ошибок компоновщика. Теперь у вас есть доступ к globalStruct из каждого модуля компиляции, включая mystruct.h.

0 голосов
/ 13 августа 2011

Если вы хотите разделить любую переменную между несколькими файлами cpp, вы должны объявить ее в заголовке как extern.И без extern в одном этих файлов C ++.

Если вы этого не сделаете, у вас не будет ссылок, поскольку у нескольких объектов будет переменная с одинаковым именем.Вместо этого при использовании extern один объект будет иметь эту переменную, а другие объекты связывают ее.

0 голосов
/ 30 июля 2011

Вы должны определить структуру в заголовочном файле только , вы должны удалить определение из main.cpp

0 голосов
/ 31 июля 2011

Может быть, вы можете дать больше информации о том, каков макет вашего проекта.

Исходя из предположения, возможно, ваша проблема может быть одной из двух:

  1. вы хотите переслать объявление структуры.

  2. использование защитных ограждений для предотвращения переопределения.

См. Следующую ссылку, чтобы узнать, как обрабатывать оба:

http://www.adp -gmbh.ch / cpp /forward_decl.html

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

0 голосов
/ 30 июля 2011

В заголовке вы объявляете, из чего будет состоять ваш struct (вероятно, файл common.h, включаемый main.cpp и myfile.cpp):

struct MyStruct {
    int messageID;
    int tempVariable;
};

В вашем main.cpp,вот где вы на самом деле используете структуру:

void someFunction() {
    struct MyStruct tempStruct;

    // do something with it
    tempStruct.messageID = 1;

}

Не помещайте определение вашего struct в ваши main.h и main.cpp - иначе вы получите ошибку переопределения!

Также не включайте файл cpp - включайте заголовочный файл (например, common.h).Не зная больше о структуре вашей программы, трудно предоставить лучшую информацию.

0 голосов
/ 30 июля 2011

Стандартный подход C / C ++:

// source.h
Put all struct, class, typedef, macro definitions, extern variable declaraltions


// source.cpp
Implement the class, functions, define global/external variables


// main.cpp, and other parts of program
#include"source.h"
0 голосов
/ 30 июля 2011

Декларация и определения - это две разные вещи. Для вашего случая вы выделяете место для вашей структуры в main.cpp. В вашем заголовке вы должны использовать модификатор extern для своей структуры, чтобы все файлы, включающие файл заголовка, искали структуру в глобальном пространстве имен. Надеюсь, это поможет.

0 голосов
/ 30 июля 2011

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

0 голосов
/ 30 июля 2011

Проблема в том, что в результате вы получаете один и тот же код дважды в результате, если вы видите включение как просто импорт кода.

Вы можете использовать #ifdef, чтобы исправить это, см. http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...