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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2010, 19:31   #1
optimator
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 92
По умолчанию #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, 22:41   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

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

Цитата:
//========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, 17:40   #3
optimator
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 92
По умолчанию

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

код в студию
p51x вне форума Ответить с цитированием
Старый 28.11.2010, 03:14   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

Цитата:
а при попытке запуска программы идет ругань на вызов конструкторов и методов классов, описанных в 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 вне форума Ответить с цитированием
Старый 28.11.2010, 23:38   #7
optimator
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 92
По умолчанию

Цитата:
код в студию
Вот код:
Код:
//========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; 28.11.2010 в 23:46.
optimator вне форума Ответить с цитированием
Старый 01.12.2010, 14:37   #8
optimator
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 92
По умолчанию

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

Цитата:
Сообщение от 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 вне форума Ответить с цитированием
Ответ


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

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

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


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