如何解决vs
code
中
nullptr
未定义及相关
C++
标准设置问题
如果你在VS
Code
编辑
C++
代码,并且遇到了
nullptr
未定义(
nullptr
出现红色波浪下划线)。这实际上是VS
code
编辑器
中
C++
标准设置的问题,你会发现你能够正常运行代码,只是这些鲜红的警告让你很头疼。如下图是
报错
的地方。
你需要做的是打开偏好设置
中
的设置选项:
然后在搜索框
中
键入cpp standard,将cpp standard从默认修改为
c++
11 (或其他你正在使用的
c++
标准)。
此时再返回代码处,
报错
就消
racket-review旨在对各个Racket模块进行表面平整的整理,目的是尽快发现问题。 它不会扩展它插入的程序。
当前,它
报
告以下问题:
[error] “提供了标识符*,但未定义”
[error] “标识符已定义”
[error] “如果表达式必须包含一个用于then-branch的表达式,另一个必须包含else-branch的表达式”
[error] “让表单必须包含至少一个正文表达式”
[error] “语法错误”
[error] “在匹配表达式的失败情况下使用_而不是其他字符”
[error] “ case子句必须采用(...)的形式,而不是'”
[error] “将'()用于匹配模式,而不是
null
或
null
”
[warning] “租赁
中
的绑定应用方括号括起来”
[warning] “标识符*已定义”
[warn
C++
中
的
null
和
nullptr
都是表示空指针的关键字,但它们的含义和用法有所不同。
null
是
C++
早期版本
中
用来表示空指针的关键字,它实际上是一个整数常量。在
C++
11标准
中
,
null
被定义为一个宏,它的值也是。因此,使用
null
表示空指针时,实际上是将一个整数常量赋值给指针变量。
nullptr
是
C++
11标准
中
新增的关键字,它是一个空指针常量,可以用来初始化指针变量或与指针变量进行比较。与
null
不同的是,
nullptr
的类型是std::
nullptr
_t,而不是整数类型。使用
nullptr
可以避免一些类型转换的问题,提高程序的安全性。
总之,
null
和
nullptr
都可以用来表示空指针,但
nullptr
更加安全和规范。在
C++
11及以后的版本
中
,建议使用
nullptr
来表示空指针。
### 回答2:
null
和
nullptr
都是用来表示指针为空(指向空地址)的常量,但它们的实现方式和使用上还是有些区别的。
首先,
null
是C语言和
C++
03标准
中
用来表示空指针的常量,通常被定义为0或者((void*)0),比如在C语言
中
:
int* p =
NULL
;
而在
C++
11标准
中
,
null
被重新定义为
nullptr
,因此在
C++
11及以上版本
中
,上述代码应该写为:
int* p =
nullptr
;
nullptr
是
C++
11引入的一个新关键字,用来代替原来的
null
,可以更加安全的表示空指针。与
null
不同的是,
nullptr
是一个真正的指针类型,而不是一个整数类型。它可以隐式转换为任何其他指针类型,但不能转换为整数。这样可以避免一些潜在的类型转换问题,同时还可以避免和整数类型产生混淆。
另外,使用
nullptr
还可以给编写代码者提供编译时的友好提示。对于一些接受指针作为参数的函数,有时候我们在传参时会传入一个整数0,这样的代码是合法的,但容易引起歧义。如果函数声明时使用
nullptr
作为默认参数,就可以清晰地表达这个参数是一个指针类型,而不是整数类型。
总之,虽然
null
和
nullptr
都是用来表示空指针的常量,但
nullptr
更加安全和明确。因此,在
C++
中
,建议尽量使用
nullptr
代替原来的
null
。
### 回答3:
在C语言
中
,
null
是一个宏定义,表示空指针,通常被定义为整型常量0。在指针使用
中
,通常将空指针用来表示一个无效的、未初始化或已被释放的指针。
而在
C++
11
中
,新增了一个关键字
nullptr
,用来表示空指针,它是一个特殊类型的字面量常量,可以隐式转换为任何指针类型。与
null
不同的是,
nullptr
类型不是整数类型,因此可以避免在一些隐式转换
中
出现问题。
举个例子,考虑以下代码:
```
c++
void foo(int i) {
cout << "foo(int)" << endl;
void foo(char* ptr) {
cout << "foo(char*)" << endl;
int main() {
foo(
NULL
); // 会调用foo(int)
foo(
nullptr
); // 会调用foo(char*)
return 0;
由于
NULL
被定义为整型常量0,因此在调用foo时会优先匹配int类型的参数。而使用
nullptr
则会被视为指向空指针的char*类型,因此会调用foo(char*)。
总之,
nullptr
克服了传统的
null
使用
中
的一些缺陷,提高了
C++
程序的类型安全性和健壮性,是一个在
C++
11
中
非常有用的新特性。