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

С++ для начинающих

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

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

10.08.2011, 10:36. Просмотров 2113. Ответов 24
Метки нет (Все метки)

Доброго дня!

имею 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()'

был бы рад услышать что-либо в помощь. Спс.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2011, 10:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перенос в другую единицу трансляции (C++):

Перенос динамического массива из одной функции в другую - C++
Всем привет, задача отдельными функция реализовать заполнение и вывод массива на экран, но проблема в том что необходимо в функцию вывода...

Модуль трансляции - C++
Что такое модуль трансляции? Из книги:

Шаблоны и единицы трансляции - C++
Всем привет. Единица трансляции - это *.cpp с включенными в него файлами, я так понимаю Тогда почему не работает такой вариант:...

Как использовать шаблонную функцию в другой единице трансляции? - C++
Как исправить ошибку? Спрашиваем у однокурсников и никто не знает(( file1.cpp export template<typename T> T twice(T t) ...

Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции - C++
Безопасно ли такое использование: // config.cpp const int ival = 6; const SomeNonTrivialClass obj(...); // config.h extern...

Проверка бита на единицу - C++
Подскажите, корректно ли такое сравнение if((paramData &= 0x80) == 1) // проверка на наличие единицы(1) в 8-ом бите данного байта длины...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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
4821 / 3241 / 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 11:07 #7
Цитата Сообщение от SatOleg Посмотреть сообщение
но разве нормально включать *.сс файлы?
Нет конечно.

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

Как ты компилируешь программу?
accept
4821 / 3241 / 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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 то все нормально компилируется. Если же вместе добавлять то ошибка
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2011, 12:34
Привет! Вот еще темы с ответами:

Увеличение на единицу не срабатывает - C++
Запускается с аргументами "hello world" hello в качестве переменной. world как значение. printf("Param Count: %i\n", argc); for(int...

Количество столбцов не содержащих единицу - C++
for (j=0;j<m;j++){ for (i=0;i<n;i++){ if (A==1) k++; } if (k++) t++; } cout << "\n Kol-vo stolbcov ne sodirshashih...

Как вывести мнимую единицу? - C++
Писал программу, решающую квадратное уравнение и столкнулся с проблемой вывода мнимой единицы, кое-как выкрутился, но возможно ли сделать...

Прибавить к значению переменной единицу - C++
задается символьная переменная к переменной прибавляется 1 выводится прежнее состояние и получиное пешить на с++


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.08.2011, 12:34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru