2011-01-06 5 views
1

Ich habe einige Header aus einem C++ - Hintergrund, die viele vorgebackene "defaults" für deklarierte Typen verwenden. z.B.C - wie Standardwerte für Typen in C-Headern festgelegt werden

// Header. 

typedef struct 
{ 
    float red; 
    float green; 
    float blue; 
} RGBColor; 

// Defaults. 
const RGBColor kRGB_White = {1.0f, 1.0f, 1.0f}; 
const RGBColor kRGB_Black = {0.0f, 0.0f, 0.0f}; 

...

// Source file. 

RGBColor aColor = kRGB_White; 

Q. Ich brauche diese Header in C aus Kompatibilitätsgründen zu konvertieren. Gibt es eine Möglichkeit, diese Standardwerte für einen C-Header neu zu erstellen, vorzugsweise ohne die Datenstrukturen selbst zu ändern?

danke.

extern const RGBColor kRGB_White; 
extern const RGBColor kRGB_Black; 

und legen Sie die Definitionen in einer einzigen C-Datei, die in verknüpft wird:

Antwort

5

Um Probleme mit doppelten globalen Definitionen zu verhindern, werden Sie die Erklärungen Ihrer const Strukturen in den Header ändern möchten .

Eine Alternative ist es, die const Strukturen zu verändern statisch zu sein, so dass es nicht weh tut, wenn sie in mehreren verschiedenen Modulen am Ende:

static const RGBColor kRGB_White = {1.0f, 1.0f, 1.0f}; 
static const RGBColor kRGB_Black = {0.0f, 0.0f, 0.0f}; 

Dies kann dazu führen, dass die Objekte im endgültigen verknüpften Bild mehr als einmal angezeigt werden, aber die Linker von heute sind wahrscheinlich schlau genug, um die Duplikate loszuwerden (ich denke - einige Tests könnten in Ordnung sein, wenn die Strukturen dies tun mit sind groß und/oder zahlreich).

Falls Sie besorgt sind über die consts mit anderen Variablen zu initialisieren, dies:

RGBColor aColor = kRGB_White; 

ist in C Fein (es scheint relativ häufig für Programmierer zu denken, dass C dies für einige nicht erlaubt Grund - vielleicht war es nicht immer in Vor-Standard-C erlaubt?).

+0

ich viele Leute denken, 'RGBColor aColor = kRGB_White glauben,' nicht C legal, weil 'int foo [ 4] = {1,2,3,4}; int bar [4] = foo' ist nicht legal und Arrays scheinen mehr exponiert zu sein als Strukturen. – SiegeX

+1

Ich würde dazu tendieren, den 'static const'-Ansatz zu empfehlen - er macht die Definition der 'const'-Objekte für den Compiler verfügbar, ohne dass die Moduloptimierung der Verbindungszeit erforderlich ist. Sie können auch keine 'const' Objekte verwenden, um Objekte mit statischer Speicherdauer zu initialisieren - Sie sollten auch' #define KRGB_WHITE_STATIC {1.0f, 1.0f, 1.0f} 'für diesen Fall erstellen. – caf

+0

Vielen Dank für Ihre Hilfe. Unter Verwendung von gcc 4.0 unter OS X 10.6.6 verursachte der "static const" -Ansatz "doppelte Symbol" -Fehler. Trauriges Gesicht. Und, noch trauriger, die Neudefinition von ihnen als Makros Ansatz auch nicht funktioniert. Ich denke, ich muss den Ratschlag nehmen, sie als extern zu deklarieren und sie alle in eine Quelldatei zu stecken. Prost. – SirRatty

1

Wenn Sie nicht den Standardwert Erklärungen aus der Header-Datei verschieben, neu zu definieren, sie als Makros:

// Might not be a clean solution... 
#define kRGB_White {1.0f, 1.0f, 1.0f} 
#define kRGB_Black {0.0f, 0.0f, 0.0f} 
+1

Wenn Sie C99 garantieren können, können Sie zumindest '((RGBColor) {1.0f, 1.0f, 1.0f})' machen, damit die Leute nicht versuchen, etwas wie 'float f [] = kRGB_White;'. [Haftungsausschluss über die Zwecklosigkeit des Versuchs, Menschen daran zu hindern, dumme Dinge über das Typsystem zu tun, anstatt klare und eindeutige Dokumentation.] –

+1

Dies funktioniert als Initialisierer, funktioniert aber nicht in der Zuweisung. Außerdem funktioniert es nicht im Lvalue-Kontext. Ich nehme an, dass das OP diese Anwendungen auch brauchen könnte. – AnT

+0

@AndreyT - 'const' Objekte funktionieren auch nicht im Lvalue Kontext, und in C99 glaube ich, dass meine modifizierte Version in der Zuweisung funktionieren würde. –

Verwandte Themen