在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么



考虑这个程序:

#include <iostream>
printStatement(std::string msg) {
std::cout << msg;
return true;
}
int main() {
char w = printStatement("Hello World");
}

我使用MinGW-gcc在Windows上编译这段代码,令我惊讶的是,编译器在没有任何异议的情况下编译了它,变量w显然在函数调用后被设置为"\001"。有几件事困扰着我:

  1. printStatement没有返回类型-显然这是隐式设置为";int">
  2. 但我返回了一个布尔值-是否发生了向int的隐式转换
  3. 我将结果存储在char中——是否再次发生了从int到char的隐式转换

我真的很想问:谁在开发C++时阻止我开枪,因为编译器显然不在乎。

所有C++标准中都禁止隐式返回类型。某些实现可能允许它们存在。这是大多数行业编码标准所禁止的。我甚至不打算查询gcc是如何处理这种情况的(无论它是否意味着intbool返回值(,因为你真的不应该这么做

这是实现定义的行为,但你不应该这样做。打开所有警告-Wall,应该对此发出警告。无论如何,默认情况下都应该打开-Wall,并将所有警告视为错误,除非您有充分的理由允许在.中输入警告代码

我意识到我不是在回答你编号的问题,但你问题的真正答案是"这些都不重要,不要这样做,打开你的警告"。

来源:https://wiki.sei.cmu.edu/confluence/display/c/DCL31-C.+声明+标识符+之前+使用+them

  1. printStatement没有返回类型-显然这是隐式设置为"int">

不在标准C++中。这样的声明是不合时宜的。但在第一个C标准(大约30年前(和标准前的C(甚至更早(中都是这样。一些编译器支持将其作为向后兼容性的语言扩展。


  1. 但我返回了一个布尔值-是否发生了到int的隐式转换

是。bool可以隐式转换为整数类型。


  1. 我将结果存储在char中-是否再次发生从int到char的隐式转换

是。整数类型可转换为char


谁在开发C++时阻止我开枪,因为显然编译器不在乎。

您的雇主/主要开发人员可能会要求您不要使用语言扩展,因为从可移植性的角度来看,语言扩展是一个问题。

编译器需要诊断格式错误的声明。以下是它可能产生的诊断消息的示例:

ISO C++禁止声明没有类型[-fpermission]的"printStatement">

作为C++程序员,读取编译器输出对于避免错误至关重要。如果编译器没有生成这样的诊断消息,那么它就不符合C++标准。这通常被认为是编译器中的一个错误。

第页。S.从intchar的转换可能是潜在的危险(在大多数系统上(,因为该值可能无法在目标类型中表示。您的编译器可以选择警告此类潜在危险的CONVERION(-Wconversion(。

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 $ 

最新更新