C语言中"extern"的确切含义和头文件名与代码文件名等效

Ist*_*tel 2 c

我用Google搜索并阅读,但没有找到这三个简单问题的答案......

  1. 头文件名是否应该等于代码文件名?例如,我在foo.h中声明了函数void foo().它在main.c中使用,包括foo.h必须在foo.c中实现foo()吗?如果它将在foox.c中实现怎么办?因为我的源代码有decoder.h头但是decode.c代码文件,一切似乎都有效.项目中没有decoder.c或decode.h文件.

  2. 当用"extern"声明函数时,什么是"extern".在上述项目中,decoder.h声明了extern函数,而decode.c实现了它们.extern如何在这里工作以及它实际上应该如何工作?我一直认为extern用于让编译器知道它会在其他地方找到它(就像我在main.c中声明一个变量,包括foo.h,在foo.c中实现foo.h中的函数我想改变它变量的值,所以我将其声明为extern).

  3. 另外,关于C语法的小问题,我有一个代码,其函数实现看起来像这样

    int function(param1,param2,param3)
    int param1,*param2;
    char param3;
    {
        function body
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我的Qt Creator抱怨这个代码和代码导航不起作用,但代码编译和执行良好.这是什么语法?我以前从未见过......

小智 6

  1. C语言不关心您对源文件和头文件的命名.您可以使用编译器将接受的任何名称,并将任何函数放在您希望的任何.c文件中.其他一些工具可能会关心,但语言却没有.实际上,如果您将源文件命名为bar.source而不是foo.c,那么该语言并不关心(但是,您的编译器可能会这样).

  2. extern告诉编译器该变量未在此编译单元中定义(.c文件加上它包含的所有头文件),但在其他地方.在引用某些其他编译单元中定义的全局变量时,您几乎只需要使用它.您可以将它与函数一起使用,但它是隐式的,因此不需要.

  3. 您展示的语法是用于定义函数的非常古老的语法.它在第一个C标准之前使用,直到20世纪80年代后期.不要再使用它了.如何处理参数类型的规则是过时的和不必要的复杂,并且使用新式函数声明和定义会使所有不好的事情消失.

你的例子会更好地写成:

int function(int param1, int *param2, char param3)
{
    function body
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是旧式函数不能char作为参数传递,所以最后一个参数应该是真的int param3.