Страниц: [1]
  Печать  
Автор Тема: реализовать #pragma once  (Прочитано 7180 раз)
Andsin
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Апреля 21, 2005, 09:19:44 am »

привет!
документация по препроцессору gcc рекомендует использовать дурективы условной компиляции для сабжа.
проект состоит из трех фаулов:
sermod.hh
#ifndef SERMOD_HEADER
#define SERMOD_HEADER

typedef unsigned int UINT;

const char *SERIAL_DEVICE1_NAME = "/dev/ser1";
const char *SERIAL_DEVICE2_NAME = "/dev/ser2";
const UINT SERDEVNAME_LENGTH = 128;   

#endif

файл Try1.cc
#include <cstdlib>
#include <iostream>
#include <Ph.h>
#include <Pt.h>
#include <photon/Pf.h>
#include "sermod.hh"

int main(int argc, char *argv[]) {
   std::cout << "Welcome to the Momentics IDE" << std::endl;
   if (PtInit(NULL) == -1){
      PtExit(EXIT_FAILURE);
      return(EXIT_FAILURE);
   }
   char Helvetica12[MAX_FONT_TAG];
   PtNotice(NULL, NULL, SERIAL_DEVICE1_NAME, NULL,
         "Books cannot always please, however good;
Minds are not ever craving for their food.",
         PfGenerateFontName("Helvetica", 0, 12, Helvetica12),
         "How &true!", NULL, Pt_MODAL);   
   PtExit(EXIT_SUCCESS);
   return EXIT_SUCCESS;
}
файл sermod.cc
#include "sermod.hh"

при компиляции получаю ошибки
make -k all
make -j 1 -Cx86 -fMakefile all
make[1]: Entering directory `F:/QNX630/workspace/Try1/x86'
make -j 1 -Co -fMakefile all
make[2]: Entering directory `F:/QNX630/workspace/Try1/x86/o'
F:/QNX630/host/win32/x86/usr/bin/rm -f F:/QNX630/workspace/Try1/x86/o/Try1
F:/QNX630/host/win32/x86/usr/bin/qcc -Vgcc_ntox86  -lang-c++ -lang-c++    -oF:/QNX630/workspace/Try1/x86/o/Try1    Try1.o    sermod.o  -L. -LF:/QNX630/target/qnx6/usr/lib -LF:/QNX630/target/qnx6/x86/lib -LF:/QNX630/target/qnx6/x86/usr/lib    -lPh    
sermod.o(.data+0x0): multiple definition of `SERIAL_DEVICE1_NAME'
Try1.o(.data+0x0): first defined here
sermod.o(.data+0x4): multiple definition of `SERIAL_DEVICE2_NAME'
Try1.o(.data+0x4): first defined here
cc: F:/QNX630/host/win32/x86/usr/bin/ntox86-ld caught signal 1
make[2]: *** [F:/QNX630/workspace/Try1/x86/o/Try1] Error 1
make[2]: Target `all' not remade because of errors.
make[1]: [all] Error 2 (ignored)
make[2]: Leaving directory `F:/QNX630/workspace/Try1/x86/o'
make -j 1 -Co-g -fMakefile all
make[2]: Entering directory `F:/QNX630/workspace/Try1/x86/o-g'
F:/QNX630/host/win32/x86/usr/bin/rm -f F:/QNX630/workspace/Try1/x86/o-g/Try1_g
F:/QNX630/host/win32/x86/usr/bin/qcc -Vgcc_ntox86  -lang-c++ -lang-c++    -oF:/QNX630/workspace/Try1/x86/o-g/Try1_g    Try1.o    sermod.o  -L. -LF:/QNX630/target/qnx6/usr/lib -LF:/QNX630/target/qnx6/x86/lib -LF:/QNX630/target/qnx6/x86/usr/lib    -lPh   -g    
sermod.o(.data+0x0):F:/QNX630/workspace/Try1/sermod.cc: multiple definition of `SERIAL_DEVICE1_NAME'
Try1.o(.data+0x0):F:/QNX630/target/qnx6/usr/include/cpp/xlocinfo: first defined here
sermod.o(.data+0x4):F:/QNX630/workspace/Try1/sermod.cc: multiple definition of `SERIAL_DEVICE2_NAME'
Try1.o(.data+0x4):F:/QNX630/target/qnx6/usr/include/cpp/xlocinfo: first defined here
cc: F:/QNX630/host/win32/x86/usr/bin/ntox86-ld caught signal 1
make[2]: *** [F:/QNX630/workspace/Try1/x86/o-g/Try1_g] Error 1
make[2]: Target `all' not remade because of errors.
make[1]: [all] Error 2 (ignored)
make[2]: Leaving directory `F:/QNX630/workspace/Try1/x86/o-g'
make[1]: Leaving directory `F:/QNX630/workspace/Try1/x86'

компилю с на хосте x86, win32.
что это, клюк компилятора? как пофиксить?
Записан
Andsin
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #1 : Апреля 21, 2005, 09:54:04 am »

вот сами ошибки.
sermod.o(.data+0x0): multiple definition of `SERIAL_DEVICE1_NAME'
Try1.o(.data+0x0): first defined here
sermod.o(.data+0x4): multiple definition of `SERIAL_DEVICE2_NAME'
Try1.o(.data+0x4): first defined here

sermod.o(.data+0x0):F:/QNX630/workspace/Try1/sermod.cc: multiple definition of `SERIAL_DEVICE1_NAME'
Try1.o(.data+0x0):F:/QNX630/target/qnx6/usr/include/cpp/xlocinfo: first defined here
sermod.o(.data+0x4):F:/QNX630/workspace/Try1/sermod.cc: multiple definition of `SERIAL_DEVICE2_NAME'
Try1.o(.data+0x4):F:/QNX630/target/qnx6/usr/include/cpp/xlocinfo: first defined here
т.е. получается переопределение констант, от которого не удалось по непонятным причинам избавиться строками:
#ifndef SERMOD_HEADER
#define SERMOD_HEADER
Записан
mike
QOR.Moderator
*****
Offline Offline

Сообщений: 1186


Welcome to Lunatic Asylum.


Просмотр профиля WWW
« Ответ #2 : Апреля 21, 2005, 10:21:18 am »

см. F:/QNX630/target/qnx6/usr/include/cpp/xlocinfo, там эти дефайны уже объявлены
"Andsin"
т.е. получается переопределение констант, от которого не удалось по непонятным причинам избавиться строками:
#ifndef SERMOD_HEADER
#define SERMOD_HEADER

эта конструкция исключает повторное включение хеадера (в вашем случае sermod.hh) и по понятным причинам никак не избавляет вас от переопределения дефайнов в другом хеадере
Записан
MikeP
Участник
*
Offline Offline

Сообщений: 6


Просмотр профиля WWW
« Ответ #3 : Апреля 21, 2005, 10:24:24 am »

И не получится.
Место констант не в заголовочных файлах.
Если доступ к ним очень нужен тогда их в .cc, а в .hh их объявить так:
extern const char * SERIAL_DEVICE1_NAME
Записан
mike
QOR.Moderator
*****
Offline Offline

Сообщений: 1186


Welcome to Lunatic Asylum.


Просмотр профиля WWW
« Ответ #4 : Апреля 21, 2005, 10:27:40 am »

черт, глюкнул... мой ответ отменяется
Записан
Andsin
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #5 : Апреля 21, 2005, 11:46:14 am »

MikeP

абсолютно верно! спасибо!
ведь память под char* выделяется полюбому...
Записан
Страниц: [1]
  Печать  
 
Перейти в: