当我浏览一个巨大的源代码时,我遇到了一些文件,其中只有一个函数被声明,比如说,“code.h”但是在“code.c”中有许多函数被声明和定义。
在.c文件中声明和定义函数的确切用法是什么? 我们如何从其他源文件中访问源文件中的其中一个函数?
如果有人能提供一个例子,那会很有帮助。感谢
答案 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;
}
答案 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
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”中有函数没有全局范围,请考虑将它们设置为“静态”。