C中的函数原型

Kei*_*ler 2 c header

今天早些时候,我正在查看各种头文件,只是为了将它们与我正在制作的文件进行比较,并注意到它们似乎声明它们的功能有点不同.

例如,这里是strlen来自的声明string.h:

extern size_t __cdecl strlen(const char *);

在进行一些研究后,我发现这extern是用于在功能块之外声明变量.最佳做法是在头文件中声明我的函数extern吗?

我看到他们使用的size_tunsigned long long在这里,而不是int,我假设这是因为它由于几个原因(例如字符串的长度永远不会是负数)更有效,但这是他们size_t在这里使用的原因吗?还是我完全忽略了这一点?

最后我看到__cdecl哪些我找不到太多信息.究竟是__cdecl什么?我也应该使用它吗?

最后,我注意到在此声明中,传递的争论没有变量名称strlen.我猜这是因为这不是一个函数原型,只是一个声明,而原型在其他地方.为什么strlen(const char *str)声明中没有变量名称?

我的最后一个问题是,如果这只是一个声明,strlen的函数原型会是什么样子?我的猜测是这样的:

size_t strlen(const char *str)

我只是问,因为我想学习和改进我的代码(假设我在C文件中创建函数原型/声明,然后在头文件中只是函数声明,以便其他C文件可以使用它们).

Roh*_*han 6

  1. size_t是比较合适的返回值strlen而不是int
  2. __cdecl是函数的调用约定.这表示谁为参数,返回值等设置堆栈以及谁清除它.更多参考:调用约定
  3. 在声明函数时,您实际上不需要参数名称.只是参数类型就足够了.

更新extern:

  • extern告诉编译器该语句只是一个声明而不是定义.因此对于函数原型,extern不会添加任何值,因为它只是一个定义.参考:C外部

希望这可以帮助.

  • 这只是原型.编写实际函数时,将命名参数. (4认同)