Форум программистов, компьютерный форум CyberForum.ru

Перенос в другую единицу трансляции - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
10.08.2011, 10:36     Перенос в другую единицу трансляции #1
Доброго дня!

имею main файл содержащий

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
#include "Worker.hh"
 
bool prepared = false;
 
void prepare_one()
{
    prepared = true;
    Worker::Part1 = 0x11;
}
 
void hard_work()
{
     GoodWork = 0x77;
     prepare_one();
}
...
компилируется и выполняется без проблем.

Необходимо выделить вспомогательную функцию в отдельную единицу трансляции


делаю так
one.hh
C++
1
2
 void prepare_one();
bool prepared;
one.cc
C++
1
2
3
4
5
6
7
8
9
10
#include "one.hh"
#include "Worker.hh"
 
prepared = false;
 
void prepare_one()
{
    prepared = true;
    Worker::Part1 = 0x11;
}
main.cc
C++
1
2
3
4
5
6
7
8
#include "one.hh" ;
...
void hard_work()
{
     GoodWork = 0x77;
     prepare_one();
}
...
и искренне надеюсь что это заработает но получаю ошибку линковки

[Linker error] undefined reference to `prepare_one()'

был бы рад услышать что-либо в помощь. Спс.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 10:49     Перенос в другую единицу трансляции #2
А ты не забываешь присоединять к проекту файл one.cc ? После того как компилятор выдает ошибку в директории проекта появляется файл one.obj (или one.o) ?
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
10.08.2011, 10:57  [ТС]     Перенос в другую единицу трансляции #3
Цитата Сообщение от lazybiz Посмотреть сообщение
А ты не забываешь присоединять к проекту файл one.cc ? После того как компилятор выдает ошибку в директории проекта появляется файл one.obj (или one.o) ?
а разве

C++
1
#include "one.hh" ;
недостаточно чтобы подключить one.cc/
Как тогда мне поступить?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
10.08.2011, 10:59     Перенос в другую единицу трансляции #4
Цитата Сообщение от SatOleg
Необходимо выделить вспомогательную функцию в отдельную единицу трансляции
единицы трансляции - это .cpp файлы
в заголовочный файл нужно записывать только объявления

C++
1
2
void prepare_one();
bool prepared;
void prepare_one(); - это объявление
bool prepared; - это определение
определение должно быть в единице трансляции

C++
1
2
void prepare_one();
extern bool prepared;
можешь сделать так

и убери точку с запятой после директивы
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 11:02     Перенос в другую единицу трансляции #5
Цитата Сообщение от SatOleg Посмотреть сообщение
недостаточно чтобы подключить one.cc/
Не достаточно.

Цитата Сообщение от SatOleg Посмотреть сообщение
Как тогда мне поступить?
А как ты компилируешь свою программу?
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
10.08.2011, 11:06  [ТС]     Перенос в другую единицу трансляции #6
Проблема в принципе решается, если в основном файле вписать
C++
1
#include "one.cc"
но разве нормально включать *.сс файлы?

может мне поможет такая конструкция?

C++
1
2
3
4
#define DECL_12( prefix ) \
    int prefix##_one(); \
 
DECL_12( prepare )
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 11:07     Перенос в другую единицу трансляции #7
Цитата Сообщение от SatOleg Посмотреть сообщение
но разве нормально включать *.сс файлы?
Нет конечно.

Цитата Сообщение от SatOleg Посмотреть сообщение
может мне поможет такая конструкция?
Не поможет.

Как ты компилируешь программу?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
10.08.2011, 11:07     Перенос в другую единицу трансляции #8
Цитата Сообщение от SatOleg
но разве нормально включать *.сс файлы?
его надо добавить в проект
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
10.08.2011, 11:11  [ТС]     Перенос в другую единицу трансляции #9
Цитата Сообщение от lazybiz Посмотреть сообщение
Нет конечно.

Не поможет.

Как ты компилируешь программу?
через Dev-c++ , компилятор MiniGW
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 11:22     Перенос в другую единицу трансляции #10
Цитата Сообщение от SatOleg Посмотреть сообщение
через Dev-c++ , компилятор MiniGW
Ёп-т. А я им и не пользовался никогда. Подскажите кто знает как добавить файл в проект.
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
10.08.2011, 11:29  [ТС]     Перенос в другую единицу трансляции #11
Цитата Сообщение от lazybiz Посмотреть сообщение
Ёп-т. А я им и не пользовался никогда. Подскажите кто знает как добавить файл в проект.
Да добавить это не проблема, спасибо. А подскажите могу я вообще удалить one.hh , добавив к проекту one.cc
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 11:55     Перенос в другую единицу трансляции #12
Цитата Сообщение от SatOleg Посмотреть сообщение
А подскажите могу я вообще удалить one.hh , добавив к проекту one.cc
Не желательно. Если ты его удалишь из проекта а потом внесешь в него изменения, то компилятор не перекомпилирует зависимые от него файлы что может привести к большому геморрою.
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
10.08.2011, 12:25  [ТС]     Перенос в другую единицу трансляции #13
Возник еще один смежный вопрос.
если имеется класс Worker содержащий статические поля (описан )
C++
1
2
3
4
5
6
class Worker
{
    static const int Part2 = 0x22;
    static const int Part3 = 0x44;
public:
        static int Part1;
я его подключаю и в one.cc и в two.cc, которые добавлены в один проект и получаю ошибку

multiple definition of `Worker::Part1'
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 12:30     Перенос в другую единицу трансляции #14
Цитата Сообщение от SatOleg Посмотреть сообщение
я его подключаю и в one.cc и в two.cc
Опять же, каким образом ты его подключаешь?
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
10.08.2011, 12:34  [ТС]     Перенос в другую единицу трансляции #15
Да также заголовочным файлом
#include "Worker.hh"

если использовать или one.cc или two.cc то все нормально компилируется. Если же вместе добавлять то ошибка
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 12:44     Перенос в другую единицу трансляции #16
Что-то я не соображу ни как в чем проблема... Как на счет того чтобы кинуть весь код целиком?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
10.08.2011, 12:50     Перенос в другую единицу трансляции #17
Цитата Сообщение от SatOleg Посмотреть сообщение
если использовать или one.cc или two.cc то все нормально компилируется. Если же вместе добавлять то ошибка
Телепатически я определил, что инициализация Worker::Part1 происходит тоже в .h файле.
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
10.08.2011, 13:21  [ТС]     Перенос в другую единицу трансляции #18
Да инициализирую я как раз в файле .h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef WORKER_H
#define WORKER_H
 
class Worker
{
    static const int Part2 = 0x22;
    static const int Part3 = 0x44;
public:
        static int Part1;
    int part1(){return Part1;}
    int part2(){return Part2;}
    int part3(){return Part3;}
};
int Worker::Part1=0x11;
#endif
в Worker.сс файле просто указываю
C++
1
#include "Worker.hh"
one.cc
C++
1
2
3
4
5
6
7
8
9
#include "one.hh"
#include "Worker.hh"
bool prepared = false;
 
void prepare_one()
{
    prepared = true;
    Worker::Part1 = 0x11;
}
two.cc
C++
1
2
3
4
5
6
7
8
9
#include "two.hh"
#include "Worker.hh"
bool prepared = false;
 
void prepare_two()
{
    prepared = true;
    Worker::Part1 = 0x88;
}
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
10.08.2011, 13:23     Перенос в другую единицу трансляции #19
Цитата Сообщение от SatOleg Посмотреть сообщение
Да инициализирую я как раз в файле .h
Ну вот это и не правильно. Инициализацию надо поместить в один из модулей. Но только в один. А сейчас инклюдом он сразу в двух модулях размещается, что и приводит к ошибке компоновки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2011, 13:23     Перенос в другую единицу трансляции
Еще ссылки по теме:

Как вывести мнимую единицу? C++
Перенос динамического массива из одной функции в другую C++
Увеличение на единицу не срабатывает C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 13:23     Перенос в другую единицу трансляции #20
Цитата Сообщение от SatOleg Посмотреть сообщение
int Worker::Part1=0x11;
Эта штука должна быть в .cc файле.
Yandex
Объявления
10.08.2011, 13:23     Перенос в другую единицу трансляции
Ответ Создать тему
Опции темы

Текущее время: 16:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru