Любой способ повторно использовать идентификатор в области? - PullRequest
2 голосов
/ 22 октября 2010

Обычно использование того же идентификатора, что и имя переменной, для чего-то похожего на другую переменную в той же области генерирует ошибку компилятором. Существует ли какая-либо методика для указания компилятору, что в этой области до этой конкретной точки это имяЦель и используется для ссылки на эту переменную, но после этой точки то же имя будет ссылаться на что-то еще, например, на другую переменную с другой целью?

Ответы [ 4 ]

7 голосов
/ 22 октября 2010

Если вы имеете в виду переменные, нет, нет. Когда вы создаете переменную, она привязывается к определенному типу и определенному местоположению. Сказав это, ничто не мешает вам повторно использовать одну и ту же переменную для двух разных вещей:

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

Вы можете использовать указатель, чтобы его можно было изменить, чтобы он указывал на другую переменную, но я подозреваю, что это не то, что вы спрашиваете. В любом случае, если вы не используете указатель void и приводите его, он все равно привязан к определенному типу:

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.

Если то, что вы предлагаете, является чем-то вроде:

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;

Я не уверен, что вижу смысл. Я думаю, что вы могли бы сделать это, поместив определения в новую область видимости (то есть в фигурные скобки):

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

но это не так, как если бы у нас была всемирная нехватка имен переменных. И, если вы правильно называете свои переменные, маловероятно, что строка и число с плавающей точкой будут иметь одинаковые имена (возможно, double и float, но это все еще сомнительная функция для добавления в язык).

5 голосов
/ 22 октября 2010

Ну, вы можете использовать блоки внутри функции, каждый из которых создает свою собственную область.

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
   }
}
0 голосов
/ 22 октября 2010
void fn()
{
    int a = 1;
#define a b
    int a = 2;
}

но ... немного бессмысленно даже пробовать это, правда?

0 голосов
/ 22 октября 2010

Очень весело, когда люди спрашивают о крайне непонятных уголках языка.Можно заподозрить домашнее задание (тот, кто задал вопрос, почти должен знать «ответ»).Но в любом случае, ...

#include <iostream>

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

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

Приветствия & hth.,

...