C中的常量返回类型

C中的常量返回类型,c,constants,C,Constants,我正在阅读一些代码示例,它们返回了一个const int。当我试图编译示例代码时,我遇到了关于冲突返回类型的错误。所以我开始搜索,认为const是问题所在(当我删除它时,代码运行良好,不仅编译成功,而且工作正常)。但我从来没有找到与const返回类型相关的信息(我找到了结构/参数等,但没有找到返回类型)。所以我试着写一段代码来简单地展示const可以做什么。我想到了这个: #include <stdio.h> int main() { printf("%i", method

我正在阅读一些代码示例,它们返回了一个const int。当我试图编译示例代码时,我遇到了关于冲突返回类型的错误。所以我开始搜索,认为const是问题所在(当我删除它时,代码运行良好,不仅编译成功,而且工作正常)。但我从来没有找到与const返回类型相关的信息(我找到了结构/参数等,但没有找到返回类型)。所以我试着写一段代码来简单地展示const可以做什么。我想到了这个:

#include <stdio.h>

int main() {
    printf("%i", method());
}

const int method() {
    return 5;
}

然而,每当我删除const时,它就会像预期的那样,简单地打印出一个5,a,继续使用生命。那么,有谁能告诉我const用作返回类型时应该是什么意思吗。谢谢。

main
看到在没有原型的情况下使用了
method()
,因此它假设它返回int。然后您将它声明为返回
const int
。将
method()
的声明移到
main
之前,或者将原型放在
main
之前,在调用之前添加method()的原型将修复错误

const int method();
int main() {
    printf("%i", method());
}

此错误告诉我们,
method()
是由编译器创建的(因为它没有找到它),返回类型与
const int
(可能是int)不同


另一个错误告诉我们,事实上,编译器创建了自己版本的
方法

C,当您使用函数时,在您向C充分介绍函数之前,它会猜测函数的返回类型——它的名称、返回类型、常量和参数。如果这些猜测是错误的,你就会得到错误。在这种情况下,他们错了。使用原型或将函数移到调用上方

哦,关于常数:
这意味着如果使用相同的参数再次调用函数,函数的值将是相同的,并且应该没有(重要的)副作用。这对于优化非常有用,而且它还提出了一个书面声明,即编译器可以强制执行相关参数。函数承诺不会改变常量,编译器可以帮助阻止它。

您发布的代码至少应该给您一个未定义的标识符:
方法
。在调用函数之前,需要在作用域中声明。更好地使用:

#include <stdio.h>

const int method() {
    return 5;
}

int main() {
    printf("%i", method());
}
#包括
常量int方法(){
返回5;
}
int main(){
printf(“%i”,method());
}

定义也是一种声明。因此,这应该可以修复错误。

const
对返回值没有意义,因为返回值在任何情况下都是右值,无法修改。您得到的错误是因为您在声明函数之前使用了该函数,因此隐式假定该函数返回
int
,而不是
const int
,但当实际定义该方法时,返回类型与原始假设不匹配。如果返回
double
而不是
int
,则会得到完全相同的错误

例如:



看看把警告级别调高是多么有帮助

在本例中,问题是不同的:在声明之前使用
method()
,因此隐式假定它返回
int
。依赖这种过时的行为有点不好。将示例更改为将
method()
声明为返回
const int
,以使其更具代表性。换句话说,
const
和非
const
类型之间存在标准冲突,
const
类型是函数返回的类型这一事实与此无关。gcc是否仍然具有-ansi pedantic选项?新代码可能必须使用它。Meta-pedantic:
-ansi
-pedantic
是单独的选项;-)meta-pedant:pedantic正在检查标准的一致性,C标准包括“过时”的行为。好吧,我已经很久没有关心过了,但我很确定有一个选项强制使用原型。那不是ansi吗?是的,它起作用了。非常感谢。我从未意识到,当方法位于使用它们的位置之下时,GCC创建了它们。我想这是头文件通常包含在源代码中的另一个原因…谢谢你。你在调用之前没有添加任何原型。这是一个没有原型的声明;而不是常量int方法()@LeifAndersen是的。谢谢,我把原型放在那里,它解决了问题。gcc使用的一组好选项是:
-Wall-ansi-pedantic-std=c99
。也可以在GCC的文档中查找其他内容。@dirkgently:
-ansi
相当于
-std=c89
将其与
-std=c99
一起使用是没有意义的。为什么会被选中?这是错误的,因为C在看到类似于函数调用的未定义标识符时不会出错。它只是假设函数的类型是int()。@直接地,据我所知,ANSI C只是在注释上有所不同,没有规范性的措辞(我不记得确切的意思)。有链接吗?请提供一个引用,说明const限定返回类型意味着函数具有纯行为,它为相同的输入值生成相同的返回值?我从来没有听说过。诚然,这是GNU文档,而不是一个标准,但它应该可以让您继续。我从Borland的C++编译器的书中学习到了Windows是强制性的。+ 1提到了真正的<代码> const < /Cord>解释返回值。您应该提到,在使用gcc时,最好使用
\uuuu属性(const))
\uu属性(pure))
。这是不一样的,甚至最后那一页也有错误。该语言规定不得在函数类型上指定
const
。l
Line 7: error: conflicting types for 'method'
Line 4: error: previous implicit declaration of 'method' was here
#include <stdio.h>

const int method() {
    return 5;
}

int main() {
    printf("%i", method());
}
#include <stdio.h>

int main() {
    printf("%i", method());
}

double method() {
    return 5;
}
$ gcc -std=c99 -Wall -Wextra -pedantic impl.c
impl.c: In function ‘main’:
impl.c:4: warning: implicit declaration of function ‘method’
impl.c: At top level:
impl.c:7: error: conflicting types for ‘method’
impl.c:4: note: previous implicit declaration of ‘method’ was here