为什么变量名称和数据类型名称被允许使用函数但不包含关键字?
问题描述:
此前我们已经使用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
这是明确的类型名称。
答
确认对方的回答(这说,这是使用的是启用了您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
作为你的 特别的例子中一个明确的类型名称。无论您使用node
与new
或malloc
,它确实是同样的问题和解决方案 。
但正如已经指出的那样,最好为您的类型和变量选择不同的名称。
编译器不应该理解上下文吗? – 2015-01-21 04:52:25
不可以。您只能在同一范围内为标识符指定一个含义。有时会超过另一个(“阴影”),有时会导致编译器错误。 – 2015-01-21 04:55:38