• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Include проблема (redefine Error) Vs 2005

  • Автор темы CyberM
  • Дата начала
Статус
Закрыто для дальнейших ответов.
C

CyberM

Привет всем.
У меня возникла такая проблема:
есть заголовочный файл с прототипами, макросами , переменными
есть Срр фаил с телами ф-ций и Срр фаил с их вызовами и основным кодом,
в общем всё как обычно
типо этого
Код:
// zag.h

#include <some_inlude.h>

typedef struct STR_
{
//...
}STR;

extern long global_perem; //глобально для всех где есть этот инклуд
void fnx_1(void); //прототип ф-ии 
void fnx_2(void);

//** конец zag.h *****************************************
//main.c
#include "zag.h"

STR str;
long global_perem=1; //должно быть обьявленно хоть в одном *.c файле где включен zag.h иначе глюк

void fnx_1(void)
{
global_perem=2;
fnx_2();
}

//** конец main.c ******************************
//dop.c
#include "zag.h"

STR str_1;

void fnx_2(void)
{
global_perem=2;
}
//*** конец dop.с ***************************



но возникают ошибки типа повторного определения переменных
или ещё что-то

пытаюсь использовать
#ifndef _BLA_
#define _BLA_
//вся байда
#endif

но вся равно не помогает

Ругается на все переменные. Это я Вижуал 2005 использую. Я брал работающие проэкты и та же проблема: не хочет компилиовать сли код разбрасон по нескольким файлам, если всё в 1 Срр фаил засунуть то всё работает нормально.


В чём проблема? Что делать?
Может какие-то опции надо установить?
Или ещё что-то?
 
P

Pasha

Код:
//dop.c
#include "zag.h"

STR str_1;

void fnx_2(void)
{
global_perem=2;
}
//*** конец dop.h ***************************
Так все-таки dop.h или dop.c?
 
P

Pasha

Для: CyberM
Выложи исходники полностью. Или хотя бы текст ошибки. И переименуй файлы из .c в .cpp, вижуал к этому очень болезненно относится :)
 
C

CyberM

поставил СРР
не помогло

а кода много слишком. всё выложить не могу.
токо часть
вот упростил до 3-ёх фций, таже самая прблема.

MainHeader.h
Код:
#pragma once
/*#ifndef _MAIN_HEADER_H
#define _MAIN_HEADER_H		 */
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include <olectl.h> 
#include <ole2.h>
#include <objbase.h>
#include <iostream>		// include important C/C++ stuff
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>
#include <io.h>
#include <fcntl.h>
#include <time.h>
typedef struct BITMAP_FILE_TAG
{
BITMAPFILEHEADER bitmapfileheader; // Здесь содержится
// заголовок растрового файла
BITMAPINFOHEADER bitmapinfoheader; // Здесь содержатся
// все данные, включая палитру
PALETTEENTRY palette[256]; //Здесь хранится палитра
UCHAR * buffer; // Указатель на данные
} *BITMAP_FILE_PTR,BITMAP_FILE;	
#define WINDOW_CLASS_NAME L"GameConsole"
#define RANDOM (srand( (unsigned)time( NULL ) ))

HINSTANCE hMainInstance; 

long __X=0;
int window_closed=0;

wchar_t text[12]={0};

RECT dest_rect,source_rect; // Здесь хранится адрес
BITMAP_FILE bitmap1;

HWND main_window_handle = NULL;
HINSTANCE main_instance = NULL;

int Start(void *parms = NULL, int num_parms = 0);
LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
int WINAPI WinMain(	HINSTANCE hinstance,HINSTANCE hprevinstance,LPSTR lpcmdline,int ncmdshow);

1.cpp
Код:
#include "MainHeader.h"

int Start (void *parms , int num_parms )
{		
__X=100;
swscanf_s(text,L"Bla-bla X=%ld",__X);
return(1);
}

WinFuncs.cpp
Код:
#include "MainHeader.h"

//////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hwnd, 
UINT msg, 
WPARAM wparam, 
LPARAM lparam)
{
// this is the main message handler of the system
PAINTSTRUCT	ps;		  // used in WM_PAINT
HDC			hdc;	  // handle to a device context

// what is the message 
switch(msg)
{	
case WM_CREATE: 
{
// do initialization stuff here
return(0);
} break;

case WM_PAINT:
{
// start painting
hdc = BeginPaint(hwnd,&ps);
// the window is now validated 
// end painting
EndPaint(hwnd,&ps);
return(0);
} break;
case WM_DESTROY: 
{
// kill the application			
PostQuitMessage(0);
return(0);
} break;
default:break;
} // end switch

// process any messages that we didn't take care of 
return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc

// WINMAIN //////////////////////////////////////////////////////////////////////////////////

int WINAPI WinMain(	HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
// this is the winmain function
hMainInstance = hinstance;
WNDCLASSEX winclass;	// this will hold the class we create
HWND	 hwnd;		// generic window handle
MSG		 msg;		// generic message
HDC	 hdc;	  // generic dc
PAINTSTRUCT ps;	 // generic paintstruct
// first fill in the window class stucture
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL,IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

// Регестрируем класс
if(!RegisterClassEx(&winclass)) return(0);
main_instance	 = hinstance;

if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME,	// class
L"WIN3D Game Console",	// title
WS_POPUP | WS_VISIBLE,
0,0,					// initial x,y
0, // intial width
0, // initial height
NULL,		// handle to parent 
NULL,		// handle to menu
hinstance,// instance
NULL)))	// creation parms
return(0);
// save the window handle and instance in a global
main_window_handle = hwnd;
Start();
MessageBox(main_window_handle, text, L"BLA_BLA", MB_OK);
// enter main event loop
while(1)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{ 
// test if this is a quit
if (msg.message == WM_QUIT)
break;
// translate any accelerator keys
TranslateMessage(&msg);
// send the message to the window proc
DispatchMessage(&msg);
} // end if
// main game processing goes here
} // end while
// shutdown game and release all resources
// return to Windows like this
return(msg.wParam);

} // end WinMain

ошибки
Код:
Error	4	error LNK2005: "struct BITMAP_FILE_TAG bitmap1" (?bitmap1@@3UBITMAP_FILE_TAG@@A) already defined in 1.obj	WinFuncs.obj
Error	5	error LNK2005: "struct tagRECT source_rect" (?source_rect@@3UtagRECT@@A) already defined in 1.obj	WinFuncs.obj
Error	6	error LNK2005: "struct tagRECT dest_rect" (?dest_rect@@3UtagRECT@@A) already defined in 1.obj	WinFuncs.obj
Error	7	error LNK2005: "struct HINSTANCE__ * hMainInstance" (?hMainInstance@@3PAUHINSTANCE__@@A) already defined in 1.obj	WinFuncs.obj
Error	8	error LNK2005: "long __X" (?__X@@3JA) already defined in 1.obj	WinFuncs.obj
Error	9	error LNK2005: "int window_closed" (?window_closed@@3HA) already defined in 1.obj	WinFuncs.obj
Error	10	error LNK2005: "wchar_t * text" (?text@@3PA_WA) already defined in 1.obj	WinFuncs.obj
Error	11	error LNK2005: "struct HWND__ * main_window_handle" (?main_window_handle@@3PAUHWND__@@A) already defined in 1.obj	WinFuncs.obj
Error	12	error LNK2005: "struct HINSTANCE__ * main_instance" (?main_instance@@3PAUHINSTANCE__@@A) already defined in 1.obj	WinFuncs.obj
Error	13	fatal error LNK1169: one or more multiply defined symbols found	D:\VisualStudio2005WorksFolder\Visual Studio 2005\Projects\DX\GameConsole\Debug\GameConsole.exe	1
 
E

European

<!--QuoteBegin-CyberM+29:06:2007, 13:39 -->
<span class="vbquote">(CyberM @ 29:06:2007, 13:39 )</span><!--QuoteEBegin-->пытаюсь использовать
#ifndef _BLA_
#define _BLA_
//вся байда
#endif
[snapback]70890" rel="nofollow" target="_blank[/snapback]​
[/quote]
Это успешно заменяет "#pragma once" в начале заголовочного файла
 
E

European

Если в заголовочном файле, подключаемом более чем к одному файлу реализации, содержаться объявления глобальных переменных, то каждая из таких переменных должна быть объявлена как extern. Кстати, в твоем первом примере я не нашел ничего крамольного, все должно работать
 
P

Pasha

Ну вот в MainHeader.h крамола:
Код:
HINSTANCE hMainInstance;

long __X=0;
int window_closed=0;

wchar_t text[12]={0};

RECT dest_rect,source_rect; // Здесь хранится адрес
BITMAP_FILE bitmap1;

HWND main_window_handle = NULL;
HINSTANCE main_instance = NULL;
Скопировать это в отдельный cpp. В MainHeader.h дописывать extern переменным и убрать инициализацию.

З.Ы. #pragma once вообще-то уже там стоит.
З.З.Ы. и вообще, у кого из нас на С++ специализация? :blink:
 
E

European

<!--QuoteBegin-Kmet+29:06:2007, 17:00 -->
<span class="vbquote">(Kmet @ 29:06:2007, 17:00 )</span><!--QuoteEBegin-->непереносимое решение.
[snapback]70912" rel="nofollow" target="_blank[/snapback]​
[/quote]
Про непереносимость куда конкретно ты говоришь? На не-майкрософтовский компилятор?
<!--QuoteBegin-Pasha+29:06:2007, 17:01 -->
<span class="vbquote">(Pasha @ 29:06:2007, 17:01 )</span><!--QuoteEBegin-->В MainHeader.h дописывать extern переменным и убрать инициализацию.
[snapback]70913" rel="nofollow" target="_blank[/snapback]​
[/quote]
Точно
<!--QuoteBegin-Pasha+29:06:2007, 17:01 -->
<span class="vbquote">(Pasha @ 29:06:2007, 17:01 )</span><!--QuoteEBegin-->Скопировать это в отдельный cpp.
[snapback]70913" rel="nofollow" target="_blank[/snapback]​
[/quote]
Я бы сказал, что в один из *.cpp, и добавить инициализацию...
 
E

European

<!--QuoteBegin-Kmet+8:07:2007, 17:33 -->
<span class="vbquote">(Kmet @ 8:07:2007, 17:33 )</span><!--QuoteEBegin-->Вы считаете, что эта такая уж редкая штука?
[snapback]71679" rel="nofollow" target="_blank[/snapback]​
[/quote]
Не буду спорить... Но вопрос все-таки задавался в ветке по MS Visual C++
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!