/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
#define vs. const
Fra : Mads Jensen


Dato : 15-03-05 20:25

Hej

Det er vist mest et spørgsmål stillet af interesse, mere end fordi det
skal bruges til noget.

Efter at have læst i "The C Programming Language, 2nd edition" og læst,
at en af fornyelser i C89 i forhold til den første udgave af C var
"const" identifier'en, som angiveligvis gør det samme som #define ?

Så nu er mit spørgsmål, kan #define ikke betegnes som forældet, eller er
der nogle ting, som gør, at man ikke kan sætte en lave en global
variabel med "const" ?

Angående brugen af #define til at lave små makroer, så kan det vel
undgåes ved at lave en inline funktion, hvis man kigger lidt i C99
standarden.

mvh.
--
Mads Jensen - remove z's in email

If the code and the comments disagree, then both
are probably wrong. -- Norm Schryer

 
 
Thorsten Ottosen (15-03-2005)
Kommentar
Fra : Thorsten Ottosen


Dato : 15-03-05 21:07

"Mads Jensen" <madsj@razptuzs.dk> wrote in message
news:4237368f$0$643$edfadb0f@dread16.news.tele.dk...
| Hej
|
| Det er vist mest et spørgsmål stillet af interesse, mere end fordi det
| skal bruges til noget.
|
| Efter at have læst i "The C Programming Language, 2nd edition" og læst,
| at en af fornyelser i C89 i forhold til den første udgave af C var
| "const" identifier'en, som angiveligvis gør det samme som #define ?

ikke i C.

du kan ikke bruge

const int foo = 3;

i
int array[foo];

Genialt træk af C komiteen; Det bedste er at bruge enum { foo = 3 }; ved
integers.

| Så nu er mit spørgsmål, kan #define ikke betegnes som forældet, eller er
| der nogle ting, som gør, at man ikke kan sætte en lave en global
| variabel med "const" ?

se ovenfor.

| Angående brugen af #define til at lave små makroer, så kan det vel
| undgåes ved at lave en inline funktion, hvis man kigger lidt i C99
| standarden.

yes.

-Thorsten



Bertel Brander (15-03-2005)
Kommentar
Fra : Bertel Brander


Dato : 15-03-05 22:49

Thorsten Ottosen wrote:
> "Mads Jensen" <madsj@razptuzs.dk> wrote in message
> news:4237368f$0$643$edfadb0f@dread16.news.tele.dk...
> | Hej
> |
> | Det er vist mest et spørgsmål stillet af interesse, mere end fordi det
> | skal bruges til noget.
> |
> | Efter at have læst i "The C Programming Language, 2nd edition" og læst,
> | at en af fornyelser i C89 i forhold til den første udgave af C var
> | "const" identifier'en, som angiveligvis gør det samme som #define ?
>
> ikke i C.
>
> du kan ikke bruge
>
> const int foo = 3;
>
> i
> int array[foo];
>
> Genialt træk af C komiteen; Det bedste er at bruge enum { foo = 3 }; ved
> integers.

Det er lidt for let at sparke på et sprog der har mere end 15 år
på bagen.

>
> | Så nu er mit spørgsmål, kan #define ikke betegnes som forældet, eller er
> | der nogle ting, som gør, at man ikke kan sætte en lave en global
> | variabel med "const" ?
>
> se ovenfor.
>
> | Angående brugen af #define til at lave små makroer, så kan det vel
> | undgåes ved at lave en inline funktion, hvis man kigger lidt i C99
> | standarden.
>
> yes.

Det kan være handy.
Hvis jeg vil lave et debug interface hvor jeg kan skrive:
DEBUG(MyGroup, "Enter: " << state() << " Peter: " << whatever->Peter);

Og kunne få det til at kompilere til ingenting og kunne disable MyGroup
unden at skulle streame inden jeg tester, må DEBUG være en macro.

Men man bør forsøge at undgå macro'er hvis man kan og hvis det ikke
koster for meget.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Thorsten Ottosen (15-03-2005)
Kommentar
Fra : Thorsten Ottosen


Dato : 15-03-05 23:18

"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:42375869$0$266$edfadb0f@dread12.news.tele.dk...
| Thorsten Ottosen wrote:
| > "Mads Jensen" <madsj@razptuzs.dk> wrote in message
| > news:4237368f$0$643$edfadb0f@dread16.news.tele.dk...
| > | Hej
| > |
| > | Det er vist mest et spørgsmål stillet af interesse, mere end fordi det
| > | skal bruges til noget.
| > |
| > | Efter at have læst i "The C Programming Language, 2nd edition" og læst,
| > | at en af fornyelser i C89 i forhold til den første udgave af C var
| > | "const" identifier'en, som angiveligvis gør det samme som #define ?
| >
| > ikke i C.
| >
| > du kan ikke bruge
| >
| > const int foo = 3;
| >
| > i
| > int array[foo];
| >
| > Genialt træk af C komiteen; Det bedste er at bruge enum { foo = 3 }; ved
| > integers.
|
| Det er lidt for let at sparke på et sprog der har mere end 15 år
| på bagen.

de kunne have ændret det i C99

| >
| > | Så nu er mit spørgsmål, kan #define ikke betegnes som forældet, eller er
| > | der nogle ting, som gør, at man ikke kan sætte en lave en global
| > | variabel med "const" ?
| >
| > se ovenfor.
| >
| > | Angående brugen af #define til at lave små makroer, så kan det vel
| > | undgåes ved at lave en inline funktion, hvis man kigger lidt i C99
| > | standarden.
| >
| > yes.
|
| Det kan være handy.
| Hvis jeg vil lave et debug interface hvor jeg kan skrive:
| DEBUG(MyGroup, "Enter: " << state() << " Peter: " << whatever->Peter);
|
| Og kunne få det til at kompilere til ingenting og kunne disable MyGroup
| unden at skulle streame inden jeg tester, må DEBUG være en macro.

hvis koden er "død" inden i en inline function, så skulle det også forsvinde.

| Men man bør forsøge at undgå macro'er hvis man kan og hvis det ikke
| koster for meget.

macroe bruges faktisk en del i moderne C++ biblioteker fordi
man faktisk kan lave iterationer mv. Men man bruger det at genere kode,
ikke så meget til at erstatte functions-kald.

Se

http://www.boost.org/libs/preprocessor/doc/index.html

for de mest langhårede macro hacks.

-Thorsten



Per Abrahamsen (16-03-2005)
Kommentar
Fra : Per Abrahamsen


Dato : 16-03-05 11:47

Bertel Brander <bertel@post4.tele.dk> writes:

> Thorsten Ottosen wrote:
>> ikke i C.
>> du kan ikke bruge
>> const int foo = 3;
>> i
>> int array[foo];
>> Genialt træk af C komiteen; Det bedste er at bruge enum { foo = 3 };
>> ved integers.
>
> Det er lidt for let at sparke på et sprog der har mere end 15 år
> på bagen.

Kritiken er fair nok eftersom C overtog const fra C++, hvor man godt
kan bruge det på den måde.

N/A (21-03-2005)
Kommentar
Fra : N/A


Dato : 21-03-05 16:30



Per Abrahamsen (21-03-2005)
Kommentar
Fra : Per Abrahamsen


Dato : 21-03-05 15:59

Bertel Brander <bertel@post4.tele.dk> writes:

> C89 som havde const er så vidt jeg ved ældre end C++

Du ved forkert. C89 huggede prototyper og const fra C++.

Jeg programmerede i C++ (CFRONT 1.2 så vidt jeg husker) i flere år før
C89, og K&R1 C i flere år før jeg begyndte på C++.

Michael Rasmussen (21-03-2005)
Kommentar
Fra : Michael Rasmussen


Dato : 21-03-05 16:30

On Mon, 21 Mar 2005 15:59:09 +0100, Per Abrahamsen wrote:

>
> Du ved forkert. C89 huggede prototyper og const fra C++.
>
> Jeg programmerede i C++ (CFRONT 1.2 så vidt jeg husker) i flere år før
> C89, og K&R1 C i flere år før jeg begyndte på C++.
Er første standard af C++ ikke fra 88, altså C++88, hvori prototyper og
const er defineret? Hvis ja, må det vist hermed være fastslået, at C89
implementerede det fra C++88.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Mogens Hansen (21-03-2005)
Kommentar
Fra : Mogens Hansen


Dato : 21-03-05 17:10


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2005.03.21.15.30.25.897430@miras.org...
> On Mon, 21 Mar 2005 15:59:09 +0100, Per Abrahamsen wrote:
>
>>
>> Du ved forkert. C89 huggede prototyper og const fra C++.
>>
>> Jeg programmerede i C++ (CFRONT 1.2 så vidt jeg husker) i flere år før
>> C89, og K&R1 C i flere år før jeg begyndte på C++.
> Er første standard af C++ ikke fra 88,

Nej.
Første formelle (ISO, ANSI etc.) C++ Standard er fra august 1998, efter en
enstemming afstemning den 14. november 1997.

Før den var der ARM (The Annotated C++ Reference Manual) fra 1990, som
beskriver både const og at en funktion skal være erklæret inden den kan
kaldes.

> altså C++88, hvori prototyper og
> const er defineret?

const i C++ kan ifølge
The Design and Evolution of C++
Bjarne Stroustrup
ISBN 0-201-54330-3
spores tilbage til januar 1981.

Venlig hilsen

Mogens Hansen



Per Abrahamsen (22-03-2005)
Kommentar
Fra : Per Abrahamsen


Dato : 22-03-05 10:18

Michael Rasmussen <mir@miras.org> writes:

> Er første standard af C++ ikke fra 88, altså C++88, hvori prototyper og
> const er defineret?

C og C++ eksisterede begge længe før der var nogen standarder for
sprogene. C var de-facto defineret af pcc (portable C compiler,
compileren på Unix) og førsteudgaven af K&R _The C Programming
Language_. C++ var de-facto defineret af CFRONT, og førsteudgaven af
BS _The C++ Programming Language_. Andre compilere kunne blive solgt
som "implementerer C++ 2.0", hvor 2.0 så refererer til
versionsnummeret på CFRONT.

C89 standarden hentede inspiration fra mange steder. Primært
selvfølgelig K&R bogen og forskellige C udvidelser. Først og fremmest
pcc, dernæst CFRONT. De forsøgte (ikke altid med held) at holde sig
til at standardisere features der allerede var implementeret, og i den
forbindelse regnedes CFRONT for en implementation.

C++ standarden var meget senere, og byggede både på C89 og en
_Annotated C++ Reference Manual_ også skrevet af BS. Og en del
features der var nye, namespaces og STL for eksempel. Bjarne
Stroustrup havde en plan med sproget. Den process er lettere at
følge, fordi den er dokumenteret i bogen _Design an Evolution of C++_.


Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste