有什么方法可以在范围内重用标识符吗?

问题描述 投票:0回答:4

通常,在同一范围内使用相同的标识符(例如变量名称)来表示同一范围内的另一个变量会产生错误,是否有任何技术可以实际向编译器指示在此范围内直到这个特定点这个名称有其自己的目的并且用于引用此变量,但在此之后,相同的名称将引用其他内容,例如具有其他目的的另一个变量?

c++ scope name-mangling
4个回答
7
投票

如果你指的是变量,不,没有。创建变量时,它与特定类型和特定位置相关联。话虽如此,没有什么可以阻止您在两个不同的事情上重复使用相同的变量:

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
投票

嗯,您可以在函数中使用块,每个块都会创建自己的作用域。

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
投票

当人们询问该语言极其晦涩难懂的极端情况时,很有趣。有人怀疑这是一个家庭作业问题(提出问题的人几乎必须知道“答案”)。但无论如何,...

#include <iostream>

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

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

干杯,


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

但是...尝试这个有点毫无意义,对吧?

© www.soinside.com 2019 - 2024. All rights reserved.