考虑这个程序:
#include <iostream>
printStatement(std::string msg) {
std::cout << msg;
return true;
}
int main() {
char w = printStatement("Hello World");
}
我使用MinGW-gcc在Windows上编译这段代码,令我惊讶的是,编译器在没有任何异议的情况下编译了它,变量w显然在函数调用后被设置为"\001"。有几件事困扰着我:
- printStatement没有返回类型-显然这是隐式设置为";int">
- 但我返回了一个布尔值-是否发生了向int的隐式转换
- 我将结果存储在char中——是否再次发生了从int到char的隐式转换
我真的很想问:谁在开发C++时阻止我开枪,因为编译器显然不在乎。
int
或bool
返回值(,因为你真的不应该这么做
这是实现定义的行为,但你不应该这样做。打开所有警告-Wall
,应该对此发出警告。无论如何,默认情况下都应该打开-Wall
,并将所有警告视为错误,除非您有充分的理由允许在.中输入警告代码
我意识到我不是在回答你编号的问题,但你问题的真正答案是"这些都不重要,不要这样做,打开你的警告"。
来源:https://wiki.sei.cmu.edu/confluence/display/c/DCL31-C.+声明+标识符+之前+使用+them
- printStatement没有返回类型-显然这是隐式设置为"int">
不在标准C++中。这样的声明是不合时宜的。但在第一个C标准(大约30年前(和标准前的C(甚至更早(中都是这样。一些编译器支持将其作为向后兼容性的语言扩展。
- 但我返回了一个布尔值-是否发生了到int的隐式转换
是。bool
可以隐式转换为整数类型。
- 我将结果存储在char中-是否再次发生从int到char的隐式转换
是。整数类型可转换为char
。
谁在开发C++时阻止我开枪,因为显然编译器不在乎。
您的雇主/主要开发人员可能会要求您不要使用语言扩展,因为从可移植性的角度来看,语言扩展是一个问题。
编译器需要诊断格式错误的声明。以下是它可能产生的诊断消息的示例:
ISO C++禁止声明没有类型[-fpermission]的"printStatement">
作为C++程序员,读取编译器输出对于避免错误至关重要。如果编译器没有生成这样的诊断消息,那么它就不符合C++标准。这通常被认为是编译器中的一个错误。
第页。S.从int
到char
的转换可能是潜在的危险(在大多数系统上(,因为该值可能无法在目标类型中表示。您的编译器可以选择警告此类潜在危险的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 $