【问题标题】:Why variable name and datatype name is allowed with function but not with keyword?为什么函数允许变量名和数据类型名,但关键字不允许?
【发布时间】:2015-01-21 04:43:33
【问题描述】:

之前我们使用malloc进行动态内存分配,

struct node* node = (struct node*) malloc(sizeof(struct node));

效果很好。

在进行重构时,我将其更改为,

struct node* node = new node;

它给了我错误,

错误 1 ​​错误 C2061:语法错误:标识符“节点”

为什么相同的变量 node 名称适用于函数(malloc)而不适用于(新)。

我正在使用 Visual Studio 2012。

【问题讨论】:

    标签: c++ variables syntax malloc new-operator


    【解决方案1】:

    问题是:

    struct node* node = new node;
                 ^^^^
    

    一旦编译器看到带下划线的部分,标记node 就会引用该变量。因此,当它处理new node 时,它是new name_of_a_variable,这是没有意义的。要解决此问题,您可以将变量命名为不同的名称(无论如何这是个好主意)。

    malloc 版本没有问题,因为您从不单独使用node,您总是使用struct node,这是一个明确的类型名称。

    【讨论】:

    • 编译器不应该理解上下文吗?
    • 没有。同一范围内的标识符只能具有一种含义。有时一个会超过另一个(“阴影”),有时会导致编译器错误。
    【解决方案2】:

    确认另一个答案(说是使用关键字 struct 使您的 malloc 示例能够编译), 该程序使用 C++14 在https://ideone.com 上编译并运行:

    #include <iostream>
    struct node { int x; };
    int main()
    {
      struct node* node = new struct node;
      node->x = 1;
      std::cout << node->x << std::endl;
      return 0;
    }
    

    所以你可以在你的 具体的例子。这确实是相同的问题和解决方案 无论您将nodenewmalloc 一起使用。

    但正如已经指出的,最好为您的类型和变量选择不同的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      相关资源
      最近更新 更多