我用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
}
Run Code Online (Sandbox Code Playgroud)
我的Qt Creator抱怨这个代码和代码导航不起作用,但代码编译和执行良好.这是什么语法?我以前从未见过......
小智 6
C语言不关心您对源文件和头文件的命名.您可以使用编译器将接受的任何名称,并将任何函数放在您希望的任何.c文件中.其他一些工具可能会关心,但语言却没有.实际上,如果您将源文件命名为bar.source而不是foo.c,那么该语言并不关心(但是,您的编译器可能会这样).
extern告诉编译器该变量未在此编译单元中定义(.c文件加上它包含的所有头文件),但在其他地方.在引用某些其他编译单元中定义的全局变量时,您几乎只需要使用它.您也可以将它与函数一起使用,但它是隐式的,因此不需要.
您展示的语法是用于定义函数的非常古老的语法.它在第一个C标准之前使用,直到20世纪80年代后期.不要再使用它了.如何处理参数类型的规则是过时的和不必要的复杂,并且使用新式函数声明和定义会使所有不好的事情消失.
你的例子会更好地写成:
int function(int param1, int *param2, char param3)
{
function body
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是旧式函数不能char作为参数传递,所以最后一个参数应该是真的int param3.