我正在尝试遵循OReilly的“Cocoa and Objective C:Up and Running”(顺便说一句,这是一个很棒的读物),但是我一直都在对这些烦人的警告进行抨击。
例如:此代码段(第56-57页)......
#include <stdio.h>
#include <stdlib.h>
main() {
int total = 81;
float ratio = 1.618;
char* result;
asprintf (&result, "total: %i, ratio: %1.3f", total, ratio);
printf ("%s \n", result);
free (result);
}
把我扔了......
/Users/justianmeyer/Desktop/test.c:5: warning: return type defaults to ‘int’
/Users/justianmeyer/Desktop/test.c: In function ‘main’:
/Users/justianmeyer/Desktop/test.c:18: warning: control reaches end of non-void function
total: 81, ratio: 1.618
我已经编程了一段时间,但截至昨天我对C / Objective C来说还是全新的。我一直在读,未声明的方法默认接受/返回一个int,但是不应该自动声明main()
方法?为什么需要默认为int?此外,main()
是否应该返回一个int?有什么用?收到的退货价值在哪里?
另外:有没有办法在XCode 4.2中创建“.c”文件而不将其包含在项目中?现在我正在使用TextMate作为示例,但我希望在本书的过程中尽可能熟悉XCode。
答案 0 :(得分:3)
我不了解ObjectiveC但是在标准C中你必须声明返回类型和main的参数。所以:
int main(void)
应该有效。大多数(所有)操作系统都期望从main返回int。
main的返回值是程序的退出代码,用于指示程序是否正常结束。
答案 1 :(得分:2)
警告是你的朋友。
它告诉你函数返回int但是你没有返回任何东西,因此存在潜在的问题。
答案 2 :(得分:2)
在较旧的C中,可以在没有显式返回类型的情况下定义任何函数,并且默认情况下,假定它返回int
。对于函数参数也是如此。在更新版本的C标准中, implicit-int 已被删除(前言第5段)。
此外,任何返回类型不是void
的函数(意味着函数不返回值)必须具有return
语句,否则您的程序不符合要求。如果您希望程序以明确定义的方式运行,则一致性非常重要。 main
是return
- 语句规则的一个特殊例外,它不需要 来返回语句。如果没有提供return语句,则main
函数隐式返回0(第5.1.2.2.3节)。
您的编译器警告您没有显式指定返回类型,并且控件在没有返回值的情况下到达非void函数的末尾。通过在代码中放置int
main
可以轻松解决前者问题。后者 - 即使main
是规则的一个例外 - 同样可以通过以任何方式放入一个return语句来补救,只是为了与其他非void函数保持一致。
答案 3 :(得分:1)
C函数可以写成
<return type a> <function name>( <type 1> <parameter 1>, .. ) {
...
return <element of type a>;
}
但是可以省略,但是根据编译器播放的规则集,建议指定返回类型。
答案 4 :(得分:1)
要解决这个问题,你需要int main()并返回0;最后:
#include <stdio.h>
#include <stdlib.h>
int main() {
int total = 81;
float ratio = 1.618;
char* result;
asprintf (&result, "total: %i, ratio: %1.3f", total, ratio);
printf ("%s \n", result);
free (result);
return 0;
}