c++ - 为什么从 main() 返回 NULL?
问题描述
NULL
我有时会看到在 C 和 C++ 程序中用作返回值的编码器,main()
例如:
#include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
}
当我使用 gcc 编译此代码时,我收到以下警告:
警告:return 从没有强制转换的指针中生成整数 [-Wint-conversion]
这是合理的,因为宏NULL
应该被扩展为(void*) 0
并且 main 的返回值应该是 type int
。
当我制作一个简短的 C++ 程序时:
#include <iostream>
using namespace std;
int main()
{
cout << "HelloWorld!";
return NULL;
}
并用 g++ 编译它,我确实得到了一个等效的警告:
警告:从 NULL [-Wconversion-null] 转换为非指针类型 'int'
但是,为什么它们会NULL
用作引发警告的返回值main()
呢?这只是糟糕的编码风格吗?
- 尽管有警告,但使用
NULL
而不是0
作为返回值的原因是什么?main()
- 如果这合适与否,它是实现定义的吗?如果是,为什么任何实现都想要取回指针值?
解决方案
这是合理的
是的。
因为宏
NULL
应扩展为(void*) 0
不可以。在 C++ 中,宏NULL
不得扩展为(void*) 0
[support.types.nullptr]。它可能只在 C 中这样做。
无论哪种方式,编写这样的代码都会产生误导,因为无论它是如何实现的,它NULL
都应该引用空指针常量。用它代替 anint
是一个逻辑错误。
- 尽管有警告,但使用
NULL
而不是 0 作为返回值的原因是什么?main()
无知。没有充分的理由这样做。
- 如果这合适与否,它是实现定义的吗?如果是,为什么任何实现都想要取回指针值?
不,这永远不合适。编译器是否允许它取决于实现。一个符合标准的 C++ 编译器很可能会在没有警告的情况下允许它。
推荐阅读
- android - 在flutter中通过apk安装应用程序时如何查看调试控制台?
- angular - 如何在 ag 网格中禁用高级过滤
- xml - 检索给定属性的子节点的值
- php - yii2中Rest身份验证(HttpBearerAuth)的覆盖响应
- php - 发送多个数据并在资源 api laravel 中显示它们
- python - 如何获得特定范围内的数字的频率
- apache-kafka - 执行完 yarn application kill 并再次运行后,flink 会从最后一个偏移量恢复吗?
- jhipster - JHipster 中缺少搜索字段
- android - com.google.android.gms.common.internal.zzf 类型被引用为 > 接口
- mysql - 带有if条件的单个查询中的Mysql多个选择语句