在.c文件中声明和定义的函数

时间:2018-05-30 10:49:07

标签: c header-files paradigms

当我浏览一个巨大的源代码时,我遇到了一些文件,其中只有一个函数被声明,比如说,“code.h”但是在“code.c”中有许多函数被声明和定义。

在.c文件中声明和定义函数的确切用法是什么? 我们如何从其他源文件中访问源文件中的其中一个函数?

如果有人能提供一个例子,那会很有帮助。感谢

4 个答案:

答案 0 :(得分:2)

在多个较小的例程中拆分复杂的例程可能会使代码更容易理解,并且还允许您遵循单一责任原则(What is an example of the Single Responsibility Principle?)。通过仅在.c文件中声明和定义它们(并声明它们static),您可以隐藏用户的内部详细信息。

例如,如果您创建了一个库,那么您的标题只能显示您希望用户使用的公共功能。

因此,如果您喜欢包含标题的任何人可以使用的功能,请仅将您的功能放入标题中。

如果您希望在.c文件内部保留一项功能,请认真考虑添加静态关键字:what is the advantage of static function?

--- ---编辑

  

我们如何从其他源文件访问源文件中的其中一个函数?

如果该功能不是static,您可以在技术上将其声明在任何地方*您也喜欢并在那里使用它。但是,根据上述论点,这将是不好的做法。

示例:

交流转换器

int secret_a(int x)
{
    return x+1;
}

的main.c

#include <stdio.h>

//access a secret function from a.c
int secret_a(int);

int main()
{
    printf("secret_a(3) gives: %d\n", secret_a(3));
    return 0;
}
  • (*)C语言允许的任何地方

答案 1 :(得分:0)

  

我们如何从其他源文件访问源文件中的其中一个函数?

这是在标题中定义一些函数的整个想法,有些仅在c文件中。

标题中定义的函数可以由其他源文件调用。 可以隐藏仅在源文件中定义的函数 - 通常的做法是将仅在源文件中声明的函数标记为静态。 这使得它们的可见性仅限于文件范围(只有同一文件中的代码才能“看到”函数)。

答案 2 :(得分:0)

这样做的原因是将代码拆分为更清晰和排序的格式,以便有关特定操作的功能可以组合在一个文件中,然后从其他文件中调用。注意:除了良好的编程习惯外,这不是必须的。

现在有两种方法可以做到: 1.包括文件 2.将函数声明为extern,然后在链接时链接它们。

1。 包含该文件是您可能在手头的代码中看到的方法。函数在一个文件中定义,并使用#include“filename。[h / c]”包含该文件,然后调用在给定文件中声明的函数。

file_to_include.c

void my_func()
{
printf("Hello!\n");
}

file_that_include.c

#include<stdio.h>
#include"file_to_include.c"
int main()
{
 my_func();
 return 0;
 }

编译你只是做

gcc file_that_include.c
  1. 使用extern,您可以执行相同的操作但不使用#include指令
  2. file_to_include.c

    void my_func()
    {
    printf("Hello!\n");
    }
    

    file_that_include.c

    #include<stdio.h>
    
    extern void my_func();
    int main()
    {
     my_func();
     return 0;
     }
    

    在这种情况下,编译时需要将两个文件都提供给编译器

    gcc file_that_include.c file_to_include.c
    

答案 3 :(得分:0)

我建议阅读“extern”关键字。

根据我在你的问题中可以理解的,你有两个文件 - “code.h”和“code.c”。但是,“code.h”只声明“code.c”中的某些函数:

code.h

int func1();
int func2();

code.c

int func1()
{
  return 1;
}

int func2()
{ 
  return 2;
}

int func3()
{ 
  return 3;
}

的main.c

#include "stdio.h"
#include "code.h"

extern int func3();

int main()
{
  printf("%d ", func1());
  printf("%d ", func2());
  printf("%d ", func3());
}

使用gcc进行编译:

  

gcc main.c code.c

的产率:

main.c: In function ‘main’:
main.c:10:17: warning: implicit declaration of function ‘func3’ [-Wimplicit-function-declaration]
   printf("%d ", func3());

并在执行时:

1 2 3

“extern”关键字基本上告诉编译器“有一个带有此声明的函数的定义”用于编译。在链接期间,链接器将找到定义,并链接到它。

然而,这是一种笨拙的方式,因为调用者(“main.c”)需要知道“code.c”中发生了什么,并不断添加更多的外部声明等等。

所以请包含在“code.h”中具有全局范围的函数。如果“code.c”中有函数没有全局范围,请考虑将它们设置为“静态”。

更多阅读: Effects of the extern keyword on C functions