【问题标题】:Exact meaning of "extern" in C and header file name equivalence to code file nameC中“extern”的确切含义和头文件名等同于代码文件名
【发布时间】:2010-11-02 14:18:06
【问题描述】:

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

  1. 头文件名应该等于代码文件名吗? 例如,我在 foo.h 中声明了函数 void foo()。在包含 foo.h 的 main.c 中使用 foo() 必须在 foo.c 中实现吗?如果它在 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 的函数我想改变它变量的值,所以我将其声明为外部)。

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

    int function(param1,param2,param3)
    int param1,*param2;
    char param3;
    {
        function body
    }
    

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

【问题讨论】:

  • 请使用稍微现代一点的 C。而 Qt Creator 是 C++。
  • 对于第二季度,请参阅SO 1433204 - 可能是许多类似问题和答案之一。
  • 好吧,Qt Creator 是 C++,但我必须使用 C 代码。当我有很多空闲工作时间时,我可能会将整个代码重写为 C++ 代码,但到目前为止 Qt Creator 为我编译 C 代码以及 C++ 代码。 3) 语法是唯一不能正确处理的东西

标签: c


【解决方案1】:
  1. C 语言不关心您如何命名源文件和头文件。您可以使用您的编译器将接受的任何名称,并将任何函数放入您希望的任何 .c 文件中。其他一些工具可能会关心,但语言不会。事实上,语言并不关心你是否将源文件命名为 bar.source 而不是 foo.c(但同样,你的编译器可能)。

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

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

你的例子最好写成:

int function(int param1, int *param2, char param3)
{
    function body
}

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

【讨论】:

    【解决方案2】:

    1) 对标头的命名没有要求。 .h 和 .c 文件使用相同的名称是一种常见约定。

    2) Extern 用于指定链接。它可以是在另一个头文件或源文件中声明的变量。它也可以用于以另一种语言声明链接,例如外部“c”。

    3) 该语法是原始的 K&R c 语法。很旧了。

    【讨论】:

    • 使用extern 声明语言链接是C++ 的一个特性。它在 C 中不存在。
    猜你喜欢
    • 2016-02-25
    • 2013-09-02
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多