Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2013, 23:07   #1
Antej
Пользователь
 
Регистрация: 09.01.2012
Сообщений: 38
По умолчанию ошибка множественного включения

есть хедер с описанными функциями. хедер включается в 2х местах. хедер целиком стандартного вида:
Код:
#ifndef OPERATORS_H
#define OPERATORS_H
//функции вида
double Mnogennja(double l, double r)
{return l*r;}
#endif
при компиляции проекта получаю ошибку:
Код:
main.o: In function `Dodavannja(double, double)':
main.cpp:(.text+0x0): multiple definition of `Dodavannja(double, double)'
ExpressionTree.o:ExpressionTree.cpp:(.text+0x0): first defined here
IDE (QtCreator 1.3.1) в обоих случаях приводит в одно итоже место.- в файл Operators.h, так для каждой обьявленной в нем функции.
что я делаю не так? если надо - приложу код...
Antej вне форума Ответить с цитированием
Старый 22.05.2013, 23:21   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2Antej
Код:
#ifndef OPERATORS_H
#define OPERATORS_H
//функции вида
inline static double Mnogennja(double l, double r)
{return l*r;}
#endif
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 22.05.2013, 23:22   #3
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Компилятор почему-то, иногда, не пересоздает объектные файлы после вот таких вот изменений.
Очистите проект (должны удалиться все moc и .o файлы) и попробуйте снова. Делается это через меню "Сборка" (или "Проект", почему-то на винде и линуксе перевод отличается) -> "Очистить проект %project_name%".


2pproger, не делать же каждую функцию inline, да и с класс нельзя inline сделать (а с ним будет такая же ошибка, при множественном определении)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 22.05.2013 в 23:27.
ROD вне форума Ответить с цитированием
Старый 22.05.2013, 23:26   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2ROD
Цитата:
Очистите проект (должны удалиться все moc и .o файлы) и попробуйте снова. Компилятор почему-то, иногда, не пересоздает объектные файлы после вот таких вот изменений.
он определил функцию с внешним связыванием в заголовочном файле. не поможет твой совет

Цитата:
2pproger, не делать же каждую функцию inline ?
такие можно
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 22.05.2013, 23:31   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
такие можно
Ну такую да, а если что-то будет более громоздкое? (хотя скорее всего компилятор ее, на самом деле, не сделает inline)

О, к стати... не обратил внимания сразу. В .h файлах лучше держать прототип функций, а сами функции реализовывать в .cpp файлах. Пример:

Файл operators.h
Код:
#ifndef OPERATORS_H
#define OPERATORS_H
//функции вида
double Mnogennja(double l, double r);
#endif
Файл operators.cpp

Код:
#include "operators.h"
double Mnogennja(double l, double r)
{return l*r;}
При этом вы везде включаете только operators.h. Файл operators.cpp никуда включать не надо (ну он только в самом проекте должен быть)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 22.05.2013 в 23:33.
ROD вне форума Ответить с цитированием
Старый 22.05.2013, 23:41   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2ROD
Цитата:
Ну такую да, а если что-то будет более громоздкое? (хотя скорее всего компилятор ее, на самом деле, не сделает inline)
ты меня сям поучить хочешь, не пойму? я отвечаю на конкретный вопрос. захотел человек определить функцию в хидере, пожалуйста, вот так это можно сделать. может у него задание такое. а ты ему разделить объявление от определения предлагаешь.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 22.05.2013, 23:43   #7
Antej
Пользователь
 
Регистрация: 09.01.2012
Сообщений: 38
По умолчанию

Большое спасибо, комрады.
Пересобрать проекте посредством make clean, make я пробовал. встраиваемые сработали. Насчет разделения реализации обьявления - я так полагая это и будет и стилистически правельнее, или без разницы?
Antej вне форума Ответить с цитированием
Старый 22.05.2013, 23:44   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

Цитата:
Сообщение от Antej Посмотреть сообщение
Большое спасибо, комрады.
Пересобрать проекте посредством make clean, make я пробовал. встраиваемые сработали. Насчет разделения реализации обьявления - я так полагая это и будет и стилистически правельнее, или без разницы?
http://stackoverflow.com/questions/1...-not-to-use-it
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 23.05.2013, 00:03   #9
Antej
Пользователь
 
Регистрация: 09.01.2012
Сообщений: 38
По умолчанию

pproger, большое спасибо еще раз.
Antej вне форума Ответить с цитированием
Старый 23.05.2013, 04:22   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
да и с класс нельзя inline сделать (а с ним будет такая же ошибка, при множественном определении)
Неужели?

Код:
#ifndef OPERATORS_H
#define OPERATORS_H

struct Test
{
   static double Mnogennja(double l, double r){return l*r;}
};
#endif
Все методы определенные в декларации класса по дефолту являются inline
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка включения файла .ехе Алексей.cpp Помощь студентам 2 04.03.2013 03:07
Оператор множественного выбора natashen'ka Visual C++ 3 06.02.2013 17:16
Паскаль. Данные множественного типа (SET) stas_kovel Паскаль, Turbo Pascal, PascalABC.NET 10 15.03.2012 23:10
Задача с оператором множественного выбора. AntoshkaK Паскаль, Turbo Pascal, PascalABC.NET 1 28.11.2011 20:10
Паскаль.Использование множественного типа **star** Помощь студентам 9 21.11.2009 16:44