我用Google搜索并阅读,但没有找到这三个简单问题的答案......
头文件名是否应该等于代码文件名? 例如,我在foo.h中声明了函数void foo()。它在main.c中使用,包括foo.h必须在foo.c中实现foo()吗?如果它将在foox.c中实现怎么办?因为我的源代码有decoder.h头但是decode.c代码文件,一切似乎都有效。项目中没有decoder.c或decode.h文件。
使用“extern”声明函数时使用的“extern”是什么。 在上述项目中,decoder.h声明了extern函数,而decode.c实现了它们。 extern如何在这里工作,它实际上应该如何工作?我一直认为extern用于让编译器知道它会在其他地方找到它(就像我在main.c中声明一个变量,包括foo.h,在foo.c中实现foo.h中的函数我想改变它变量的值,所以我将其声明为extern)。
另外,关于C语法的小问题,我有一个代码,其函数实现看起来像这样
int function(param1,param2,param3)
int param1,*param2;
char param3;
{
function body
}
我的Qt Creator抱怨此代码和代码导航不起作用,但代码编译并执行良好。这是什么语法?我以前从未见过......
答案 0 :(得分:6)
C语言不关心您对源文件和头文件的命名。您可以使用编译器将接受的任何名称,并将任何函数放在您希望的任何.c文件中。其他一些工具可能会关心,但语言却没有。实际上,如果您将源文件命名为bar.source而不是foo.c,则该语言并不关心(但是,您的编译器可能会这样做)。
extern告诉编译器该变量未在此编译单元中定义(.c文件加上它包含的所有头文件),但在其他地方。在引用某些其他编译单元中定义的全局变量时,您几乎只需要使用它。你可以也将它与函数一起使用,但它是隐含的,所以不需要。
您展示的语法是用于定义函数的非常古老的语法。它在第一个C标准之前使用,直到20世纪80年代后期。不要再使用它了。如何处理参数类型的规则过时且不必要地复杂,并且使用新式函数声明和定义会使所有不好的事情消失。
你的例子最好写成:
int function(int param1, int *param2, char param3)
{
function body
}
唯一的问题是旧式函数无法传递char
作为参数,因此最后一个参数应该是int param3
。
答案 1 :(得分:-1)
1)标题的命名没有要求。对.h和.c文件使用相同的名称是一种常见的约定。
2)Extern用于指定链接。它可以是在另一个头文件或源文件中声明的变量。它也可以用于声明另一种语言的链接,例如extern“c”。
3)该语法是原始的K& R c语法。这是非常古老的。