3 Stimmen

Gibt es eine Möglichkeit, eine Variable zu konstituieren, nachdem sie deklariert wurde?

Mögliches Duplikat:
Gibt es einen Trick, um eine Variable nach ihrer Deklaration konstant zu machen?

In C oder C++ haben wir manchmal eine Variable, die vielleicht const ist, aber wir müssen einige Codezeilen verwenden, um sie zu initialisieren.

Gibt es eine Möglichkeit, dem Compiler mitzuteilen, dass ab einem bestimmten Punkt in einer Funktion eine bereits konstruierte Variable als const betrachtet werden muss, bis ihr Geltungsbereich endet?

Etwa so:

int c = 0;
// the value of c is initialized here
switch(someVar) {
   case foo: c = 3; break;
   case bar: c = 4; break;
   default : c = 42; // what else?
}
// now c is constant
ASSUME_CONST_FROM_NOW(c) // some #pragma maybe?

Ich weiß, dass ich die Variable in einer eigenen Funktion initialisieren könnte . Das ist nicht wirklich das, worum ich bitte.

Ein weiteres Beispiel:

int c = 0; int d = 0;
{ /*some block of code that initializes both c and d jointly*/ }
ASSUME_CONST_FROM_NOW(c, d)

Es gibt keine Funktion, die zwei Werte auf einmal zurückgeben kann, ohne Strukturen oder Klassen zu erstellen.

Aber ein solcher Trick könnte nützlich sein, um alten, miserablen Code mit wenig Refactoring leichter verständlich zu machen.

9voto

Martin York Punkte 245363

Ja.

Fügen Sie die Initialisierung in eine Funktion ein.

int getInitCValue(int const& someVar)
{
    // the value of c is initialized here
    switch(someVar)
    {
        case foo: return 3;
        case bar: return 4;
        default : return 42; // what else?
    }
}

int const c = getInitCValue(someVar);

Edit: Um die geänderte Frage zu beantworten.

Sie möchten zwei Werte initialisieren:

std::pair<int,int> const value = initalizePairOfValues(someValue);
int const& c = value.first;
int const& d = value.second;

Edit 2: Gehe mit der von Péter Török gelöschten Lösung (Peter, wenn du die Löschung rückgängig machst, werde ich sie entfernen).

struct ConstValues
{
    ConstValues()
    {
         switch(....)
         // Initialize C/D
    }
    int const& getC() const {return c;}
    int const& getD() const {return d;}
    private:
       int c;
       int d;
};

9voto

etarion Punkte 16377

In C++0x können Sie etwa so vorgehen:

int const c = []() -> int { 
    int r; 
    switch(42) { 
    case 3: 
        r = 1; break; 
    case 4: 
        r = 2; break; 
    default: 
        r = 23; 
    }; 
    return r; 
}();

1voto

Jens Gustedt Punkte 74457

Wenn Sie bereit sind, einige {} um den Code, der die Variable sehen soll const ja, zumindest etwas Ähnliches. Setzen Sie etwas wie das Folgende in ein Makro:

#define CONSTIFY(T, NAME)                  \
for (bool p00 = true; p00; p00=false)      \
for (T p000 = NAME; p00; p00=false)        \
for (T const NAME = p000; p00; p00=false)

dies sollte sowohl in C99 als auch in C++ funktionieren. Technisch gesehen wird Ihre ursprüngliche Variable dadurch nicht const sondern erstellt eine neue Variable mit demselben Inhalt für den abhängigen Bereich.

Und beachten Sie, dass in einigen Fällen ( break ou continue ) könnte dies den Kontrollfluss verändern. Aber solange Sie dies um etwas wickeln, die im Grunde eine ganze Funktion Körper ist, sollte dies funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X