Archiv verlassen und diese Seite im Standarddesign anzeigen : C: public const
peschmae
12-05-2005, 19:27
Ich habe da so ein C-Programm. Vereinfacht sieht das so aus:
const.h:
#ifndef const_h
#define const_h
extern const float cst;
#endif
const.c
#include "const.h"
const float cst = 5.0;
modul1.c
#include "const.h"
modul2.c
#include "const.h"
Kompiliert wird mit
for f in *.c; do gcc -c $f; done; gcc *.o -o main; ./main
Was hier mein Problem ist ist folgendes:
Wenn ich neue Konstanten hinzufüge finde ich das recht umständlich und fehleranfällig das in const.c und const.h zu tun. Kann man das auch einfacher, d.h. zentral alles in einer Datei?
Jetzt mal von einem #define abgesehen - die mag ich nämlich überhaupt nicht.
MfG Peschmä
Wie wäre es mit
const float foobar=42; in der const.h?
peschmae
12-05-2005, 21:30
Nein, genau das geht eben leider nicht. GCC legt da offenbar irgendwie zweimal speicher an oder so :(
MfG Peschmä
Das static natürlich nicht vergessen
static const double foo=0.8/15;
peschmae
12-05-2005, 22:11
Hmm. Ich dachte static sei eben gerade *nicht* global. Aber ich lasse mich natürlich gerne eines besseren belehren falls mich das weiterbringt :)
MfG Peschmä
Ja, es wird nicht exportiert, genau das willst du doch, dass in jeder Datei, die const.h inkludiert, die Constante "neu" definiert wird.
Wenn es nicht unbedingt eine echte Konstante sein muss:
#ifndef const_h
#define const_h
#define CST 5.0
#endif
peschmae
13-05-2005, 07:23
Ja, es wird nicht exportiert, genau das willst du doch, dass in jeder Datei, die const.h inkludiert, die Constante "neu" definiert wird.
Hmm, stimmt. So gehts auch. Danke!
Mein Ansatz war immer nur *einmal* eine solche Variable zu machen - aber wenn es in jeder Datei eine hat und die statisch ist ist das natürlich auch ok.
@panzi: Ja. Das hab ich auch an einem Ort machen müssen für die Definition der Grösse eines Arrays (das nachher statisch ist) - aber ich mag #defines nicht.
MfG Peschmä
Warum magst du #defines nicht? Die sind 'ne schöne Sache. Haben mir schon etliche Wartungsstunden erspart
locus vivendi
13-05-2005, 14:15
Wie wäre es mit
Code:
const float foobar=42;
in der const.h?
Nein, genau das geht eben leider nicht. GCC legt da offenbar irgendwie zweimal speicher an oder so
Da möchte ich doch zum wiederholten Male auf einen Vorteil von C++ hinweisen. In C++ hat man nämlich die Semantik des obigen Konstruktes so definiert, daß die hier beabsichtigte Verwendung erlaubt ist. Was ja auch absolut Sinn macht.
In C++ hat man nämlich die Semantik des obigen Konstruktes so definiert, daß die hier beabsichtigte Verwendung erlaubt ist. Was ja auch absolut Sinn macht.Hier geht es aber um C.
Verwende doch #define. In C verwendet jede #define, in C++ verwendet man enum.
oracle2025
13-05-2005, 16:22
Ich nehme mal stark an, dass extern das selbe für eine Variable ist, was ein Funktions Prototyp für eine Funktion ist.
Eine Funktion tut man ja auch nicht einfach komplett in den header rein, sondern die muss man sozusagen auch zweimal definieren.
peschmae
13-05-2005, 20:17
Warum magst du #defines nicht? Die sind 'ne schöne Sache. Haben mir schon etliche Wartungsstunden erspart
Ich mag konstanten besser. Voilà.
Meine antipatie den Dingern gegenüber wurde kürzlich bestätigt als ich bei einem Kollegen 10 Minuten Fehler gesucht habe (er hate vorher 4 Stunden damit verbracht) der mit define sehr gut möglich und kaum zu finden, aber mit Const ein Ding der Unmöglichkeit war...
@locus vivendi: Meinst du ich wurde gefragt ob ich jetzt auch wirklich C verwenden will? ;)
Aber danke für den Hinweis, der Unterschied war mir nicht bewusst. Aber ich kann nicht darauf bauen dass der Betreffende der für die Verwendung von C verantwortlich ist nicht bemerkt dass da g++ im Makefile steht...
@panzi:
Wie geht der mit Enum? Naja, egal. #define mag ich nicht und mit static const int ist das Problem sauber gelöst :)
@oracle2025: Genau. Aber für Variablen ist das deklaration-definition einfach nur doof (oder anders gesagt noch doofer als für Funktionen, ich konnte dem noch nie was abgewinnen).
MfG Peschmä
oracle2025
13-05-2005, 20:27
@oracle2025: Genau. Aber für Variablen ist das deklaration-definition einfach nur doof (oder anders gesagt noch doofer als für Funktionen, ich konnte dem noch nie was abgewinnen).
Tja, so ist das halt in C/C++, in D (http://www.digitalmars.com/d/) ist das wohl besser gelöst ;) :p
peschmae
13-05-2005, 21:28
In Java auch übrigens ;)
Aber dafür hat Java die doofen Listener - die sind mühsam. Das hält sich so die Waage ;)
MfG Peschmä
enum geht nur in C++.
foo.h
#ifndef FOO_H__
#define FOO_H__
enum {
FOO = 0,
BAR = 1,
BAZ = 2
} bla_type;
// ...
bla_type x = FOO;
#endif
peschmae
14-05-2005, 13:49
Das gibts in C auch - aber das sind ja eh nur Ganzzahlwerte. Ich sehe nicht ganz wie das mein Problem lösen könnte :confused:
MfG Peschmä
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.