提问者:小点点

在函数中返回一个布尔值,而没有定义返回类型,并将结果保存在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++的时候在我的膝盖上拍摄,因为显然编译器并不关心。


共3个答案

匿名用户

隐式返回类型为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 $ 

匿名用户

  1. PrintStatement没有返回类型-显然它被隐式设置为“int”?

不是在标准C++中。 这样的声明格式不正确。 但在第一个C标准(大约30年前)和前标准C(甚至更早)中曾经是这样。 一些编译器支持这作为向后兼容的语言扩展。

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

是的。 整数类型可转换为char

在开发C++的时候,谁阻止我在我的膝盖上拍摄,因为显然编译器并不关心。

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

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

ISO C++禁止声明没有类型[-Fpermissive]的“print statement”

作为一个C++程序员,读取编译器输出对于避免错误是必不可少的。 如果编译器没有产生这样的诊断消息,那么它就不符合C++标准。