partieller Code (include *.c file) schlechter Stil?
-
@Finnegan sagte in partieller Code (include *.c file) schlechter Stil?:
Oder alternativ auch ohne Funktionen und direkt mit globalen Variablen:
hmm.. das ist auch noch ne gute idee. das stimmt..
@SeppJ sagte in partieller Code (include *.c file) schlechter Stil?:
Wenn das natürlich nur vereinfachter Beispielcode ist, und da irgendwelche Pointer eine Rolle spielen, dann ist das const natürlich wichtig. Dann aber um so mehr Vorsicht mit den statics, ob die Objekte, auf die du zeigst, auch wirklich existieren.
ja statisch objekte in c files sind ja dann nur in der c bekannt.. ich kann dann in diversen c files den selben namen der variablen nehmen oder nicht.. und was meinst du mit ob die objekte auch wirklich existieren? vll. habe ich dich auch falsch verstanden..
@SeppJ sagte in partieller Code (include *.c file) schlechter Stil?:
machen, egal ob da nun int x() oder const int x() stünde.
du meinst weil es in c keine referencen gibt.. dass da const egal is? guter hinweiß...
@SeppJ sagte in partieller Code (include *.c file) schlechter Stil?:
@Quiche-Lorraine : Ich weiß nicht, wieso du es gelöscht hast, aber ich erinnere mich noch was da stand (und ich kann meine Moderatorenfähigkeiten einsetzen, um die Geschichte zu sehen ), aber ich kann dir als Feedback geben, dass das eigentlich ein solider Vorschlag war.
ja bin offen für vorschläge, nur raus damit
-
@SeppJ
Ich war gerade ein wenig verwirrt, da ich es nur mit C++ Mitteln getestet habe.Aber danke für deinen Hinweis, ich habe ihn wiederhergestellt.
-
@Quiche-Lorraine sagte in partieller Code (include *.c file) schlechter Stil?:
Mal eine dumme Frage. Was spricht gegen:
typedef struct stDef
{
int someinfo;
} stDef ;// Je nach Kontext Foo.h
static const stDef FooDef = { 42 };// Je nach Kontext Bar.h
static const stDef BarDef = { 123 };// Je nach Kontext BarFoo.h
static const stDef definitions[2] = { FooDef, BarDef };servus, das ist ein genialer ansatz, den hatte ich anfangs auch im kopf ABER. die zeile
static const stDef definitions[2] = { FooDef, BarDef };
schmeist in VSC 14 eien compilerfehler.. dass bei FooDef ,BarDef ein konstanter austruck erwartet wird, was er auch laut code ist.. aber vsc streikt ..gcc geht..
-
#pragma once typedef struct stDef { int someinfo; } stDef; // Je nach Kontext Foo.h //static const stDef FooDef = { 42 }; #define FooDef() { 42 } // Je nach Kontext Bar.h //static const stDef BarDef = { 123 }; #define BarDef() { 123 } // Je nach Kontext BarFoo.h static const stDef definitions[2] = { FooDef(), BarDef() };
So funktioniert es. Nicht schön aber selten.
Und irgentwie vermisse ich hier schon C++ wg.
constexpr
,...Du siehst ja aich direkt das Problem. Die Defines sind nicht typsicher.
-
Das hatte ich für @SoIntMan schon vor 1,5 Monaten in statische komplexe objekte initialisieren Frage/Problem herausgefunden.
-
@Th69 sagte in partieller Code (include *.c file) schlechter Stil?:
Das hatte ich für @SoIntMan schon vor 1,5 Monaten in statische komplexe objekte initialisieren Frage/Problem herausgefunden.
ja richtig, war aber nicht direkt das Thema...
@Quiche-Lorraine sagte in partieller Code (include *.c file) schlechter Stil?:
@SoIntMan
#pragma oncetypedef struct stDef
{
int someinfo;
} stDef;// Je nach Kontext Foo.h
//static const stDef FooDef = { 42 };#define FooDef() { 42 }
// Je nach Kontext Bar.h
//static const stDef BarDef = { 123 };#define BarDef() { 123 }
// Je nach Kontext BarFoo.h
static const stDef definitions[2] = { FooDef(), BarDef() };So funktioniert es. Nicht schön aber selten.
Und irgentwie vermisse ich hier schon C++ wg. constexpr,...
Du siehst ja aich direkt das Problem. Die Defines sind nicht typsicher.netter workaround, aber gefällt mir nicht so.. muss ich mal sacken lassen
-
@SoIntMan sagte in partieller Code (include *.c file) schlechter Stil?:
ja statisch objekte in c files sind ja dann nur in der c bekannt.. ich kann dann in diversen c files den selben namen der variablen nehmen oder nicht.. und was meinst du mit ob die objekte auch wirklich existieren? vll. habe ich dich auch falsch verstanden..
Ich dachte da dran, dass die Objekte durch zu viele statics an den falschen Stellen ggf. häufiger existieren als nur einmal. Falls das nur dumme Konstanten sind, ist das kein Problem. Wenn das aber Singleton-artige Objekte sind, die einen veränderlichen Zustand tragen, dann würdest du Probleme bekommen.
-
@SeppJ sagte in partieller Code (include *.c file) schlechter Stil?:
Ich dachte da dran, dass die Objekte durch zu viele statics an den falschen Stellen ggf. häufiger existieren als nur einmal. Falls das nur dumme Konstanten sind, ist das kein Problem. Wenn das aber Singleton-artige Objekte sind, die einen veränderlichen Zustand tragen, dann würdest du Probleme bekommen.
ne das sind wirklich nur readonly daten. ich bin kein fan von static absolut nicht.. vewendet hier nur static damit die daten nur in c-file sichtbar sind und "einmal" um die Def Array zu initalisieren
-
@SoIntMan sagte in partieller Code (include *.c file) schlechter Stil?:
@Th69 sagte in partieller Code (include *.c file) schlechter Stil?:
Das hatte ich für @SoIntMan schon vor 1,5 Monaten in statische komplexe objekte initialisieren Frage/Problem herausgefunden.
ja richtig, war aber nicht direkt das Thema...
@Quiche-Lorraine sagte in partieller Code (include *.c file) schlechter Stil?:
@SoIntMan
#pragma oncetypedef struct stDef
{
int someinfo;
} stDef;// Je nach Kontext Foo.h
//static const stDef FooDef = { 42 };#define FooDef() { 42 }
// Je nach Kontext Bar.h
//static const stDef BarDef = { 123 };#define BarDef() { 123 }
// Je nach Kontext BarFoo.h
static const stDef definitions[2] = { FooDef(), BarDef() };So funktioniert es. Nicht schön aber selten.
Und irgentwie vermisse ich hier schon C++ wg. constexpr,...
Du siehst ja aich direkt das Problem. Die Defines sind nicht typsicher.netter workaround, aber gefällt mir nicht so.. muss ich mal sacken lassen
Das ist doch genau das, was ich auch mit den Makros gemacht habe (nur hier als Funktionsmakros - warum eigentlich?).
Und das Problem bei deinem Code
stDef getDef(const int id) { static stDef definitions[2] = {0}; definitions[0] = myproject_foo_def; definitions[1] = myproject_bar_def; return definitions[id]; }
ist, daß zwar
definitions
statisch ist, bei jedem Aufruf aber die einzelnen Zuweisungen jeweils ausgeführt werden (d.h. die Daten kopiert werden) -> das kann doch nicht wirklich dein Ziel sein...
-
@Th69 sagte in partieller Code (include *.c file) schlechter Stil?:
Das ist doch genau das, was ich auch mit den Makros gemacht habe (nur hier als Funktionsmakros - warum eigentlich?).
absolut, da stimmt.
@Th69 sagte in partieller Code (include *.c file) schlechter Stil?:
ist, daß zwar definitions statisch ist, bei jedem Aufruf aber die einzelnen Zuweisungen jeweils ausgeführt werden (d.h. die Daten kopiert werden) -> das kann doch nicht wirklich dein Ziel sein...
ja da hast du auch recht, aus der sichtweiße dann doch mit makros. die aufrufw finden nur selten statt, aber ich geb dir recht;)