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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2011, 15:40   #1
little_greg
 
Регистрация: 21.01.2011
Сообщений: 7
По умолчанию разделение программы на файлы и последующая компиляция

например, имеется 3 файла "file.h" с объявлением класса, "file.cpp" с реализацией методов класса и "mainfile.cpp", в котором находится сама программа, почему в учебниках, которые я читал, в "mainfile.cpp" включается файл с объявлением класса ("file.h"), у меня программа работает, только если в "mainfile.cpp" включить файл с реализацией класса ("file.cpp", в который я, естесственно включаю файл с объявлением класса - "file.h"). объясните почему так происходит. (Windows XP, Codeblocks)
little_greg вне форума Ответить с цитированием
Старый 21.01.2011, 16:27   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

тут всё зависит от параметров компиляции или системы сборки
далее лучше пусть гуру codeblocks посоветуют, как там поступать с этим, т.к. лично я использую cmake, но товарищу cmake явно пока что ни к чему
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 21.01.2011, 16:38   #3
Dayman
Форумчанин
 
Аватар для Dayman
 
Регистрация: 12.01.2011
Сообщений: 186
По умолчанию

Компилятор, ОС?
Так навскидку: может у вас в file.cpp есть что-то кроме реализации класса?
И file.cpp желательно тоже выложить.
Lingua c++ non penis caninus est.

Последний раз редактировалось Dayman; 21.01.2011 в 16:40.
Dayman вне форума Ответить с цитированием
Старый 21.01.2011, 17:29   #4
little_greg
 
Регистрация: 21.01.2011
Сообщений: 7
По умолчанию

to dayman: Windows XP sp3, Codeblocks (file.h, file.cpp, mainfile.cpp - просто используются для примера)
нет, с file.cpp все впорядке. если я собираю программу в linux с включением file.h в mainfile.cpp то все получается, а в windows - нет.
little_greg вне форума Ответить с цитированием
Старый 21.01.2011, 18:34   #5
like-nix
Форумчанин
 
Регистрация: 09.11.2009
Сообщений: 104
По умолчанию

заключите ваш класс в защитные от повторного включения макросы

например
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

class mainWindow
{
//...
};
#endif
like-nix вне форума Ответить с цитированием
Старый 21.01.2011, 19:41   #6
pacniwassano
Пользователь
 
Регистрация: 02.12.2010
Сообщений: 81
По умолчанию

#pragma once на visual studio
pacniwassano вне форума Ответить с цитированием
Старый 21.01.2011, 21:30   #7
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
Сообщение от pacniwassano Посмотреть сообщение
#pragma once на visual studio
pragma — это то, при игнорировании чего компиляция всё равно будет работать! А если её проигнорировать, то проект собираться наверняка не будет. Так что надо делать так:
Код:
#pragma once
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

class MainWindow
{
//...
};

#endif // MAINWINDOW_H
А теперь поясню.
pragma once будет подключать хедер единожды и игнорировать просьбы о повторном его подключении. Но это pragma, она не всеми компиляторами поддерживается, т.к. не является частью стандарта.
Конструкция, называемая include guard, будет пытаться его подключать каждый раз, но все разы, после первого, будет доходить до ifndef.
То есть второе медленнее (на этапе компиляции!) и работает везде, а второе быстрее, но не является частью стандарта, хоть и поддерживается некоторыми компиляторами (в т.ч. gcc).

http://ru.wikipedia.org/wiki/Pragma_once
http://ru.wikipedia.org/wiki/Include_guard
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 21.01.2011 в 21:47.
Obey-Kun вне форума Ответить с цитированием
Старый 21.01.2011, 21:39   #8
like-nix
Форумчанин
 
Регистрация: 09.11.2009
Сообщений: 104
По умолчанию

>То есть второе медленнее (на эта компиляции!) и работает везде, а второе быстрее, но не является частью стандарта, хоть и поддерживается некоторыми компиляторами (в т.ч. gcc).

Быстрее медленнее для чего для кого?

И у меня код был без #pragma once

Последний раз редактировалось Stilet; 22.01.2011 в 14:22.
like-nix вне форума Ответить с цитированием
Старый 21.01.2011, 21:46   #9
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
Быстрее медленнее для чего для кого?
Медленнее при компиляции, я же написал. И объяснил почему. И дал 2 ссылки.

А теперь финт ушами! Оказывается, если в компиляторе есть pragma once, то он и обычный include guard оптимизирует. Это касается практически всех компиляторов. То есть на деле pragma once не нужен, достаточно include guards.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Stilet; 22.01.2011 в 14:22.
Obey-Kun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компиляция программы и её запуск Kasper1 Общие вопросы по Java, Java SE, Kotlin 2 08.01.2011 15:25
компиляция многофайловой программы Анастасия777 Общие вопросы C/C++ 3 21.12.2010 16:56
(c/c++)компиляция программы @lenk@ Помощь студентам 0 02.06.2010 20:46
разделение программы world12_tk Помощь студентам 2 30.03.2009 20:05