为什么变量名称和数据类型名称被允许使用函数但不包含关键字?

问题描述:

此前我们已经使用malloc动态内存分配,为什么变量名称和数据类型名称被允许使用函数但不包含关键字?

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

它工作得很好。

虽然做再保理我把它改成,

struct node* node = new node; 

,这让我的错误,

错误1个错误C2061:语法错误:标识符 '节点'

为什么同一个变量node名称与函数(malloc)正常工作,但不适用于(新)。

我使用Visual Studio 2012

的问题是:

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

只要编译器看到划线部分,令牌node指变量。因此,当它处理new node时,它是new name_of_a_variable,这是没有意义的。要解决这个问题,你可以调用你的变量有点不同(这是一个好主意)。

malloc版本没有问题,因为您从不使用node自己,您始终使用struct node这是明确的类型名称。

+0

编译器不应该理解上下文吗? – 2015-01-21 04:52:25

+1

不可以。您只能在同一范围内为标识符指定一个含义。有时会超过另一个(“阴影”),有时会导致编译器错误。 – 2015-01-21 04:55:38

确认对方的回答(这说,这是使用的是启用了您malloc例如编译关键字 struct的), 这个程序编译和使用运行在https://ideone.com C++ 14:

#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; 
} 

所以你可以使用struct node作为你的 特别的例子中一个明确的类型名称。无论您使用nodenewmalloc,它确实是同样的问题和解决方案 。

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