Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Ответ
 
Опции темы
Старый 26.11.2010, 20:31   #1
optimator
Форумчанин
 
Регистрация: 12.11.2010
Сообщений: 92
Репутация: 25
По умолчанию #pragma once

Доброго времени суток уважаемые форумчане! Пишу прогу, в которую включаются несколько инклудников, в каждом из которых используется общий инклудник. Т.е
Код:

//========A.h=====
class A{
};
//=======A.cpp
#include "A.h"
#pragma once;
/*  некоторые действия*/

//=======B.h==
#include "A.cpp"
class B{


};

//=========C.h====
#include "A.cpp"
/*  некоторые действия*/

//===========

В основной проге подключаю 
#include "B.cpp"
#include "C.cpp"
/*  некоторые действия*/

При этом компилятор выдает предупреждения
Цитата:
warning: `#pragma once' is obsolete
D:\gcc\bin\RECV.cpp:2: warning: ignoring pragma:
Т.е как я понял, он игнорирует конструкцию #pragma once, если же ее убрать, то возникает ошибка
Цитата:
redefinition of `class A'
. Подскажите пожалуйста, почему ведется ругань на pragma и как можно обойтись без #pragma once. Компилятор g++ 2.95. Заранее спасибо
optimator вне форума   Ответить с цитированием
Старый 26.11.2010, 23:41   #2
counter
Профессионал
 
Регистрация: 18.10.2008
Сообщений: 1,410
Репутация: 431
По умолчанию

тюююю... правильнее будет так

Цитата:
//========A.h=====
#pragma once;
class A{
};
//=======A.cpp
#include "A.h"
/* некоторые действия*/

//=======B.h==
#include "A.h"
class B{


};

//=========C.h====
#include "A.h"
/* некоторые действия*/

//===========

В основной проге подключаю
#include "B.h"
#include "C.h"
/* некоторые действия*/
counter вне форума   Ответить с цитированием
Старый 27.11.2010, 18:40   #3
optimator
Форумчанин
 
Регистрация: 12.11.2010
Сообщений: 92
Репутация: 25
По умолчанию

Если подключать хедеры, то компиляция проходит успешно, а при попытке запуска программы идет ругань на вызов конструкторов и методов классов, описанных в A.h, B.h, C.h.
optimator вне форума   Ответить с цитированием
Старый 28.11.2010, 02:48   #4
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,275
Репутация: 2054

icq: 216409213
По умолчанию

код в студию
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 28.11.2010, 04:14   #5
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 21,006
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

ошибки тоже.
кстати, pragma once вполне совмещается с include guard так называемым(ifndef define endif)
посмотрите на той же вики статью про pragma once
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 28.11.2010, 11:13   #6
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Адрес: Сибиряша
Сообщений: 131
Репутация: 45

icq: 619817361
По умолчанию

Цитата:
а при попытке запуска программы идет ругань на вызов конструкторов и методов классов, описанных в A.h, B.h, C.h.
у вас в выше представленном коде их вроде вообще ненаблюдается)
__________________
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!
.pixel вне форума   Ответить с цитированием
Старый 29.11.2010, 00:38   #7
optimator
Форумчанин
 
Регистрация: 12.11.2010
Сообщений: 92
Репутация: 25
По умолчанию

Цитата:
код в студию
Вот код:
Код:

//========A.h=====
#ifndef Unit1H
#define Unit1H
class A{
	protected:
	int name;
	public:
	A(int a);
	int get_name();
};
#endif
//===========A.cpp===============

#include "A.h"

A::A(int a){
	name=a;
}

int A::get_name(){
	return name;
}
//=========B.h==========
#include "A.h"
class B{
	protected:
	int name;

	public:
	B(int b);
	B(A a);
	int get_name();
};
//===================B.cpp=========
#include "B.h"

B::B(int b){
	name=b;
}
	
B::B(A a){
	name=a.get_name();
}
	
int B::get_name(){
	return name;
}
//=======C.h=========
#include "A.h"

class C{
	protected:
	int name;
	
	public:
	C(int c);
	C(A a);
	int get_name();
};
//=========C.cpp=====
#include "C.h"

C::C(int c){
	name=c;
	}
	
C::C(A a){
	name=a.get_name();
}

int C::get_name(){
	return name;
}

//===========Основная прога==========
#include "C.h"
#include "B.h"
#include <iostream>

int main(){
	
	A a(7);
	
	B b(a);
	
	C c(a);
	
	cout<<a.get_name()<<"   "<< b.get_name()<<"   "<< c.get_name()<<endl;
	return 0;
}

Компиляция проходит нормально, а при попытке запуска выдаются ошибки:
Цитата:
g++.exe D:\gcc\bin\forum\test_obj.o -o D:\gcc\bin\forum\test_obj.exe -Wall -fpermissive -O3
D:\gcc\bin\forum\test_obj.o(.text+0 x1c):test_obj.cpp: undefined reference to `A::A(int)'
D:\gcc\bin\forum\test_obj.o(.text+0 x30):test_obj.cpp: undefined reference to `B::B(A)'
D:\gcc\bin\forum\test_obj.o(.text+0 x47):test_obj.cpp: undefined reference to `C::C(A)'
D:\gcc\bin\forum\test_obj.o(.text+0 x53):test_obj.cpp: undefined reference to `C::get_name(void)'
D:\gcc\bin\forum\test_obj.o(.text+0 x68):test_obj.cpp: undefined reference to `B::get_name(void)'
D:\gcc\bin\forum\test_obj.o(.text+0 x80):test_obj.cpp: undefined reference to `A::get_name(void)'
Failure
P.S Пепел Феникса спасибо за подсказу с #ifndef #define #endif

Последний раз редактировалось optimator; 29.11.2010 в 00:46.
optimator вне форума   Ответить с цитированием
Старый 01.12.2010, 15:37   #8
optimator
Форумчанин
 
Регистрация: 12.11.2010
Сообщений: 92
Репутация: 25
По умолчанию

Прошу пардона, так если подключать только .h, как компилятор узнает, что есть еще и одноименные .cpp, где описаны методы?
optimator вне форума   Ответить с цитированием
Старый 01.12.2010, 17:46   #9
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
Репутация: 10
По умолчанию

Цитата:
Сообщение от optimator Посмотреть сообщение
Код:

//========A.h=====
#ifndef Unit1H
#define Unit1H
class A{
	protected:
	int name;
	public:
	A(int a);
	int get_name();
};
#endif

Почему имя файла "A.h", а "#ifndef" - "Unit1H". Может "Unit1H" уже где-нибудь объявлено. Скорее всего:
Код:

//========A.h=====
#ifndef A_H
#define A_H
class A{
	protected:
	int name;
	public:
	A(int a);
	int get_name();
};
#endif

KemanSR вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
#pragma argsused Syltan Общие вопросы C/C++ 25 24.02.2010 15:35
pragma Witaliy Общие вопросы Delphi 1 31.07.2008 16:00


04:27.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru