С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

10.08.2011, 10:36. Просмотров 2219. Ответов 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()'

был бы рад услышать что-либо в помощь. Спс.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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-ом бите данного байта длины...

24
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 12:44 #16
Что-то я не соображу ни как в чем проблема... Как на счет того чтобы кинуть весь код целиком?
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
10.08.2011, 12:50 #17
Цитата Сообщение от SatOleg Посмотреть сообщение
если использовать или one.cc или two.cc то все нормально компилируется. Если же вместе добавлять то ошибка
Телепатически я определил, что инициализация Worker::Part1 происходит тоже в .h файле.
1
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;
}
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
10.08.2011, 13:23 #19
Цитата Сообщение от SatOleg Посмотреть сообщение
Да инициализирую я как раз в файле .h
Ну вот это и не правильно. Инициализацию надо поместить в один из модулей. Но только в один. А сейчас инклюдом он сразу в двух модулях размещается, что и приводит к ошибке компоновки.
1
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
10.08.2011, 13:23 #20
Цитата Сообщение от SatOleg Посмотреть сообщение
int Worker::Part1=0x11;
Эта штука должна быть в .cc файле.
1
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
10.08.2011, 13:37  [ТС] #21
Цитата Сообщение от lazybiz Посмотреть сообщение
Эта штука должна быть в .cc файле.
то есть должно быть в one.cc или two.cc ? а попытка иницилизировать в worker.cc не увенчалась успехом =(
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
10.08.2011, 13:41 #22
Цитата Сообщение от SatOleg Посмотреть сообщение
то есть должно быть в one.cc или two.cc ? а попытка иницилизировать в worker.cc не увенчалась успехом =(
Это странно. Если worker.cc подключён к проекту, то должно было сработать.
Ошибка какая?
1
DoZZer_
11 / 11 / 1
Регистрация: 09.08.2011
Сообщений: 53
10.08.2011, 13:50 #23
SatOleg,
на будущее, вводи через директиву #if сравнение на включенность этого инклудовского файла, если уже подключен, то во второй раз он инициализироваться не будет, т.к. неоднократная инициализация может встречаться нередко.
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
10.08.2011, 13:54 #24
Цитата Сообщение от DoZZer_ Посмотреть сообщение
на будущее, вводи через директиву #if сравнение на включенность этого инклудовского файла, если уже подключен, то во второй раз он инициализироваться не будет, т.к. неоднократная инициализация может встречаться нередко.
include guard, безусловно, полезная и нужная вещь, но от повторного определения переменных и функций, размещённого в заголовке, это не поможет.
1
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
10.08.2011, 14:24  [ТС] #25
Цитата Сообщение от grizlik78 Посмотреть сообщение
Это странно. Если worker.cc подключён к проекту, то должно было сработать.
Ошибка какая?
А кто сказал что он в проекте =) Всем спасибо
0
10.08.2011, 14:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2011, 14:24
Привет! Вот еще темы с ответами:

Увеличение на единицу не срабатывает - 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 выводится прежнее состояние и получиное пешить на с++


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

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