Domanda

Normalmente utilizzando lo stesso identificatore come nome di una variabile per qualcosa come un'altra variabile all'interno della stessa portata genera l'errore dal compilatore, C'è qualche tecnica per indicare in realtà a compilatore che in questo ambito fino a questo punto specifico questo nome ha il suo scopo e viene utilizzato per fare riferimento a questa variabile, ma dopo questo punto lo stesso nome sta per riferirsi a qualcos'altro come un'altra variabile con un altro scopo?

È stato utile?

Soluzione

Se vuoi dire variabili, no, non lo è. Quando si crea una variabile, è legato ad un tipo specifico e una posizione specifica. Detto questo, non c'è nulla ti impedisce di riutilizzare la stessa variabile per due cose diverse:

float f = 3.141592653589;
// do something with f while it's PI
f = 2.718281828459;
// now do something with f while it's E.

È possibile utilizzare un puntatore in modo che possa essere cambiato per puntare ad una variabile diversa, ma non è questo quello che stai chiedendo, ho il sospetto. In ogni caso, a meno che non si utilizza un puntatore nullo e lanci, è ancora legato ad un tipo specifico:

float pi = 3.141592653589;
float e  = 2.718281828459;
float *f = π
// do something with *f while it's PI
f = &e;
// now do something with *f while it's E.

Se si sta proponendo è qualcosa di simile:

float f = 3.141592653589;
// do something with f while it's PI
forget f;
std::string f = "hello";
// do something with f while it's "hello"
forget f;

Non sono sicuro di vedere il punto. Credo che si potrebbe fare che mettendo le definizioni all'interno di un nuovo ambito (vale a dire, tra parentesi graffe):

{
    float f = 3.141592653589;
    // do something with f while it's PI
}
{
    std::string f = "hello";
    // do something with f while it's "hello"
}

ma non è come se avessimo una carenza mondiale di nomi di variabili. E, se si sta bene nominare le variabili, è piuttosto improbabile che una stringa e un galleggiante sarebbe nemmeno avere lo stesso nome (doppio e galleggiare forse ma è ancora una funzione di dubbia per aggiungere al linguaggio).

Altri suggerimenti

Bene, è possibile utilizzare i blocchi all'interno della funzione, ciascuno dei quali crea il proprio campo di applicazione.

void func(void)
{
   int a;
   {
      int b;
      // here a can be used and b is an int
   }
   {
      double b;
      // here a can still be used, but int b went out of scope
      // b is now a double and has no relationship to int b in the other block
   }
}

Buon divertimento quando le persone chiedono circa i casi d'angolo estremamente oscuri della lingua. Si sospetta una domanda compiti a casa (quello che ha posto la questione sarebbe quasi dovuto conoscere "la" risposta). Ma in ogni modo, ...

#include <iostream>

struct ouch { int x; };
void ouch( ouch ) { std::cout << "ouch!" << std::endl; }

int main()
{
    struct ouch ah = {};
    ouch( ah );
}

Saluti e hth.,

void fn()
{
    int a = 1;
#define a b
    int a = 2;
}

ma ... un po 'inutile anche provare questo però, giusto?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top