【问题标题】:does code::blocks reserve names other than c++ keywords?code::blocks 是否保留 C++ 关键字以外的名称?
【发布时间】:2013-08-27 13:50:36
【问题描述】:

我是 code::blocks 的新手,对 c++ 也很陌生。我知道有很多关键字,我不应该将它们用于变量名称,并且它们通常以不同的颜色显示,就像它们在 visualstudio 中一样。现在,当我将一些代码片段从旧的 vs 项目复制到新的 code::blocks 项目时,我的一些变量名突然变了颜色。例如,在这段代码中,变量 begin 和 end 现在显示为绿色,我不明白为什么。

int begin = 0;
int end = 4;
int myarray[end];
for (int i = begin; i < end; i++)
{
    myarray[i] = i;
}

在某些情况下,此代码甚至无法编译,并且出现奇怪的“冲突声明”错误。无论如何我可以使用这些名称,还是它们以某种方式保留在 code::blocks 中?我查看了一些书籍,但据我所知,它们不是 C++ 关键字。是我现在使用 c++11 的原因吗?我正在使用 ide 的 v.12.11 和随附的 mingw 编译器。感谢您的帮助。

【问题讨论】:

  • 如果你使用 C++11 和using namespace std;,begin 和 end 实际上是函数。 en.cppreference.com/w/cpp/iterator/begin
  • 我建议避免使用所有通用变量名称,例如 begin、end、index 等。更具描述性的名称将使代码更清晰,您可以完全避免整个问题。
  • 那些不是关键字。它们是标准库容器的成员函数的名称,也是自 C++11 以来 std:: 命名空间中的非成员函数的名称。您的 IDE 必须经过培训才能识别它们。您应该避免使用这些名称,但使用它们不一定是错误的。
  • 进入设置->编辑器->语法高亮->关键字...
  • @JerryGagnon 怎么能更具描述性? firstIndexIWantToLoopOveronePastTheLastIndexIWantToLoopOver?

标签: c++ c++11 codeblocks


【解决方案1】:

我从您的困惑中得知,您还没有使用过 STL 容器……但是,如果您是 C++ 新手,那可能是个好主意。无论如何,beginend 在任何 C++ 标准中都不是关键字,在 C++11 中也不是。但它们都是函数的名称,返回一个迭代器对象,用于遍历 STL 容器,如下所示:

vector<int> x = { 1, 2, 3, 4 };
vector<int>::iterator it;

for (it = x.begin(); it != x.end(); ++it)
{
    cout << *it << endl;
}

在 C++ 日常实践中,这个概念非常常用,以至于这些名称被 CodeBlocks 列为“用户关键字”。用户关键字通常是绿色的,因此可以与语言关键字区分开来。如果这让您感到困扰,您可以随意操作列表,甚至完全删除它。只需从菜单栏中选择“设置”->“编辑器”,然后单击“语法突出显示”选项卡。在那里你可以做你喜欢的所有设置。获取manual 了解更多信息。

image http://imageshack.us/a/img189/3956/m1qe.png

不管有没有语法高亮,你都不应该出现编译错误。原因可能是,您的项目包含像 #include &lt;vector&gt; 这样的标准库头文件,而您的代码在某处包含 using namespace std;。您可能会使用预编译的标头 - 在这种情况下也要检查它。

此外,我建议您查看standard library containers 并尝试一下。与普通数组相比,它们有几个优点,但您最好自己找出答案。但是,不要让自己被这些迭代器吓倒——在 C++11 中你也可以编写

vector<string> y = { "Foo", "Bar" };
for (auto& str : y) cout << str << endl;

相反,这也适用于您的数组

float z[] = { 0.5f, 1.5f, 2.5f, 3.5f };
for (auto& num : z) cout << num << endl;

【讨论】:

    【解决方案2】:

    变量 begin 和 end 现在显示为绿色,我不明白为什么

    您可能在某处有一个using namespace std;,将标准库的部分或全部名称转储到不合适的范围内。该库包含(在许多其他名称中)称为 beginend 的函数,您的语法高亮可能会找到这些函数。

    在某些情况下,这段代码甚至无法编译

    有时,你的名字会隐藏库名,代码会编译。有时,他们不会,所以你会得到一个错误。

    我可以使用这些名称,还是以某种方式保留它们?

    是的。摆脱不适当的using 指令,您可以随意使用任何非保留名称。唯一保留的名称是关键字、带有下划线和大写字母的particular patterns 名称以及std 命名空间中的名称。

    是我现在用c++11的原因吗?

    是的。这些函数在 2011 年被添加到标准库中。

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 2012-03-09
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多