Avatar billede driis Nybegynder
14. oktober 2003 - 14:43 Der er 17 kommentarer og
1 løsning

Global #define konstant

Jeg sidder med et projekt indeholdende et antal klasser, i hver deres .h og .cpp fil, hvor mange af dem skal kende nogle globale konstanter. Derfor vil jeg lave en overordnet .h fil, der definerer konstanterne, og inkluderer de nødvendige klasse - headere. Problemet er, at jeg ikke kan bruge de definerede konstanter i koden til klasserne - compileren melder, at den ikke kender dem.

Projektets struktur er nogenlunde således:
1) CPP filen indeholdende main() inkluderer CC.h
2) CC.h indeholder følgende:
#ifndef CC_H
#define CC_H

// Konstanter
#define wheelIRQ 5
#define timeUnit      1000  // denne konstant er ikke kendt i klasserne ?

// headers til diverse klasser:
#include "IO_Driver.h"
#include "Sensor.h"
// include en masse mere

#endif

Hvordan får jeg løst problemet, så mine konstanter er kendt i samtlige klasser ?
Avatar billede angak Nybegynder
14. oktober 2003 - 14:48 #1
Jeg ved godt det her ikke er så brugbart, men det anses som dårlig vane at lave globale variable...

Det du nok burde gøre er at oprette en singleton-klasse som styrer alle variable for dig... Og så selvfølgelig beskytte dem, så du ikke får race-conditions
Avatar billede arne_v Ekspert
14. oktober 2003 - 14:49 #2
Det burde virke.

Hvis du bruger C++ kan du erstatte:

#define ONE 1

med:

const int ONE = 1;
Avatar billede driis Nybegynder
14. oktober 2003 - 15:01 #3
anqak >> Det ved jeg godt, de er heller ikke variable, men konstante.
arne_v >> Det fungerer heller ikke med const. ?
Avatar billede angak Nybegynder
14. oktober 2003 - 15:04 #4
Hvad med dine header-filer til klasserne? Inkluderer de CC.h?
Avatar billede arne_v Ekspert
14. oktober 2003 - 15:06 #5
CC_H er vel ikke blevet sat af et eller andet ?
Avatar billede driis Nybegynder
14. oktober 2003 - 15:16 #6
Nej, CC_H er ikke sat i forvejen
Avatar billede arne_v Ekspert
14. oktober 2003 - 15:38 #7
Der må jo være "et eller andet".

Er du sikker på at du inkluderer den rigtige CC.h ?

Har du checket om:

#include <stdio.h>

#include "CC.h"

int main()
{
  printf("%d\n",timeUnit);
  return 0;
}

virker ?
Avatar billede driis Nybegynder
14. oktober 2003 - 15:45 #8
Ovenstående virker. timeUnit er også kendt i den "rigtige" main, men ikke i de forskellige klasser.

Jeg bruger MS Visual Studio .NET, men det burde vel ingen forskel gøre ?

Kan det have noget med kompileringsrækkefølgen at gøre ? For hvis ikke CC.h er læst af compileren før den prøver at compile noget, der gør brug af konstanterne, vil det jo gå galt.
Avatar billede arne_v Ekspert
14. oktober 2003 - 15:47 #9
Undskyld jeg spørger, men du inkluderer naturligvis også CC.h i de
andre .cpp filer ?
Avatar billede driis Nybegynder
14. oktober 2003 - 15:53 #10
Jeg inkluderer CC.h i de andre .h filer. Er det ikke lige så godt som at inkludere den i .cpp filen ?

Jeg har jo (uddrag fra en klasse):
Sensor.h :
#include "CC.h"
#include "Thread.h"

class Sensor : public Thread
{
// klassedef.
};

og øverst i Sensor.cpp:
#include "Sensor.h"
Avatar billede driis Nybegynder
14. oktober 2003 - 15:56 #11
Hmm, jeg har nu prøvet at flytte #include "CC.h" over i cpp filen. Det virker.
Men hvad er forskellen ?

Læg lige et svar, så jeg kan lukke spm.
Avatar billede arne_v Ekspert
14. oktober 2003 - 16:37 #12
Meget mystisk.

Det burde nemlig også virke fint med Sensor.cpp -> Sensor.h -> CC.h !?!?
Avatar billede arne_v Ekspert
14. oktober 2003 - 16:37 #13
Jeg kan da godt ligge et svar, men jeg føler bare ikke at vi er trængt
til bunds i denne sag.
Avatar billede arne_v Ekspert
14. oktober 2003 - 16:37 #14
svar
Avatar billede arne_v Ekspert
14. oktober 2003 - 16:46 #15
Hvis det er arbejde så skal du jo sikkert bare videre.

Men hvis du vil bore lidt i problemet.

Virker både:

#include "CC.h"
#include "Sensor.h"

og:

#include "Sensor.h"
#include "CC.h"

eller kun en af dem ?
Avatar billede driis Nybegynder
14. oktober 2003 - 17:04 #16
Begge ovenstående virker.
Avatar billede arne_v Ekspert
14. oktober 2003 - 17:08 #17
Dybt mystisk.
Avatar billede driis Nybegynder
14. oktober 2003 - 18:22 #18
Det synes jeg også. Desværre har jeg ikke tid til at grave mere i det i øjeblikket.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis