gpt4 book ai didi

c++ - 函数声明和定义的返回类型不匹配,编译器可以接受吗?

转载 作者:太空狗 更新时间:2023-10-29 21:18:45 26 4
gpt4 key购买 nike

我在我的程序中犯了一个错误,我声明我的函数返回类型 bool,即使该函数返回一个 unsigned long long。在一个源文件中:

#include <iostream>

using namespace std;

bool base(unsigned, unsigned);

int main(){

int i = 27;
cout << base(i,3);

}

并且在另一个定义函数(和一个额外的函数 power)中:

unsigned long long power(int base, int exponent){

unsigned long long temp = 1;
if(exponent == 0) return 1;
for(int i = 1; i <= exponent; ++i)
temp *= base;
return temp;

}

unsigned long long base(unsigned x, unsigned base){

unsigned long long result = 0;
int i = 0;
while(x != 0){
result += (x%base)*power(10,i);
x = (x-(x%base))/base;
++i;
}

return result;

}

该函数以给定的基数计算出数字(这里我们以 3 为基数计算 27)。令我惊讶的是程序编译了,但不出所料输出给出了错误的答案(232 而不是预期的 1000),因为返回类型是错误的。我想知道为什么编译器允许声明中的返回类型为 bool,即使它与定义中的返回类型不对应。我的印象是函数原型(prototype)必须与其相应的定义完全匹配,否则找不到函数?这很奇怪,因为我花了一些时间试图寻找问题,因为编译器没有提出它。

最佳答案

您看到的是未定义的行为:当您以与其前向声明不兼容的方式定义函数时,您的程序格式错误:

7.5.5: If two declarations declare functions with the same name and parameter-type-list (8.3.5) to be members of the same namespace or declare objects with the same name to be members of the same namespace and the declarations give the names different language linkages, the program is ill-formed; no diagnostic is required if the declarations appear in different translation units.

当您继续调用此类函数时,行为未定义。未定义的行为可以以任何它希望的方式表现出来。在您的情况下,调用成功,但返回值不正确。

如果没有你的帮助,编译器无法弄清楚,因为这两个函数之间的连接是由链接器而不是由编译器建立的。编译器做任何事情都为时已晚,因此您需要使用不同的方法:通过创建一个包含函数声明的头文件,然后在您定义的两个文件中包含相同的头文件来避免此类错误以及调用该函数的文件。

关于c++ - 函数声明和定义的返回类型不匹配,编译器可以接受吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29463565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com