请考虑以下程序:
#include <iostream>
printStatement(std::string msg) {
std::cout << msg;
return true;
}
int main() {
char w = printStatement("Hello World");
}
我使用MinGW gcc在Windows上编译这段代码,令我惊讶的是,编译器毫无异议地编译了这段代码,变量w在函数调用后显然被设置为'\001'。 有几件事困扰着我:
我真的在质疑:谁在阻止我在开发C++的时候在我的膝盖上拍摄,因为显然编译器并不关心。
隐式返回类型为C++11(及更高版本)标准所禁止。 某些实现可能仍然允许它们存在。 这是大多数行业编码标准所禁止的。 我甚至不打算查看gcc如何处理这种情况(无论它是否意味着int
还是bool
返回值),因为您确实不应该这样做。
这是实现定义的行为,但您不应该这样做。 打开所有警告-wall
,应该对此发出警告。 默认情况下,您应该打开-wall
,并将所有警告视为错误,除非您有非常充分的理由允许警告代码进入。
我意识到我不是在回答你的问题,但对你的问题真正的答案是“这些都不重要,不要做,打开你的警告”。
来源:https://wiki.sei.cmu.edu/confluence/display/C/dcl31-c+declare+identifiers+before+using+them
printStatement没有返回类型--显然这被隐式地设置为“int”?
这在C++中是非法的
但是我返回的是一个布尔值--有没有隐式转换到int?
我将结果存储在char中--从int到char是否再次发生隐式转换?
可能两者都适用,但这仅在指定您使用的编译器并允许缺少返回类型时相关
如果您不想声明返回类型,让编译器为您做/决定,请使用auto
:
#include <iostream>
auto printStatement(std::string msg) {
std::cout << msg;
return true;
}
int main() {
char w = printStatement("Hello World");
}
和
pi@raspberrypi:/tmp $ g++ -Wall c.cc
c.cc: In function ‘int main()’:
c.cc:9:10: warning: unused variable ‘w’ [-Wunused-variable]
char w = printStatement("Hello World");
^
pi@raspberrypi:/tmp $
例如,在main的末尾添加return w;
:
pi@raspberrypi:/tmp $ g++ -Wall c.cc
pi@raspberrypi:/tmp $
不是在标准C++中。 这样的声明格式不正确。 但在第一个C标准(大约30年前)和前标准C(甚至更早)中曾经是这样。 一些编译器支持这作为向后兼容的语言扩展。
是的。 bool
隐式可转换为整数类型。
是的。 整数类型可转换为char
。
在开发C++的时候,谁阻止我在我的膝盖上拍摄,因为显然编译器并不关心。
您的雇主/首席开发人员可能会要求您不要使用语言扩展,因为从可移植性的角度来看,它们是一个问题。
需要编译器诊断格式错误的声明。 下面是它可能产生的诊断消息的示例:
ISO C++禁止声明没有类型[-Fpermissive]的“print statement”
作为一个C++程序员,读取编译器输出对于避免错误是必不可少的。 如果编译器没有产生这样的诊断消息,那么它就不符合C++标准。