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

Тема в разделе "MS Visual C++", создана пользователем CyberM, 29 июн 2007.

Статус темы:
Закрыта.
  1. CyberM

    CyberM Гость

    Привет всем.
    У меня возникла такая проблема:
    есть заголовочный файл с прототипами, макросами , переменными
    есть Срр фаил с телами ф-ций и Срр фаил с их вызовами и основным кодом,
    в общем всё как обычно
    типо этого
    Код (Text):
    // 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 Срр фаил засунуть то всё работает нормально.


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

    Pasha Гость

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

    STR str_1;

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

    CyberM Гость

    dop.c
    опечатался тут немного.
     
  4. Pasha

    Pasha Гость

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

    CyberM Гость

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

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

    MainHeader.h
    Код (Text):
    #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
    Код (Text):
    #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
    Код (Text):
    #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
    ошибки
    Код (Text):
    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
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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" в начале заголовочного файла
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Если в заголовочном файле, подключаемом более чем к одному файлу реализации, содержаться объявления глобальных переменных, то каждая из таких переменных должна быть объявлена как extern. Кстати, в твоем первом примере я не нашел ничего крамольного, все должно работать
     
  8. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    непереносимое решение.
     
  9. Pasha

    Pasha Гость

    Ну вот в MainHeader.h крамола:
    Код (Text):
    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:
     
  10. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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, и добавить инициализацию...
     
  11. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    да. или Вы считаете, что эта такая уж редкая штука?
     
  12. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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++
     
Загрузка...
Похожие Темы - Include проблема (redefine
  1. VitalikB
    Ответов:
    3
    Просмотров:
    2.116
  2. c0de3r
    Ответов:
    4
    Просмотров:
    108
  3. DobermannTT
    Ответов:
    10
    Просмотров:
    128
  4. SoulPaladin
    Ответов:
    3
    Просмотров:
    114
  5. Artael
    Ответов:
    1
    Просмотров:
    106
Статус темы:
Закрыта.

Поделиться этой страницей