其中定义了stry和其他C库函数(与声明相反)

Where are strcpy and other C library functions defined (as opposed to declared)?

本文关键字:声明 库函数 定义 stry 其他      更新时间:2023-10-16

我发现函数strcpy的声明在string.h

/* Copy SRC to DEST.  */
extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
 __THROW __nonnull ((1, 2));

但是我在哪里可以找到这个函数的定义和主体?

这是声明,不是定义。"这是如何工作的"驻留在库实现中。

例如,GNU C Library的实现可以在网上找到。

对于这个特定的函数,还问了一个SO问题

.h文件包含函数的声明。这意味着它是告诉如何调用函数的契约,但在C编译器的"世界"中。函数本身(即代码)在其他地方定义。它可能是在另一个.c文件,但这并不一定是这种情况。可以链接其他目标文件,甚至是用其他语言编写的库。strcpy()通常存在于标准库中,并且经常用汇编编写。

extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
__THROW __nonnull ((1, 2));

这个函数声明了一些你的应用程序会感兴趣的东西:extern this关键字告诉这个函数的定义是另一个编译单元,即它没有在包含该头文件的.c文件中定义。

函数接受两个形参,它们都是指向字符的指针,并返回一个指向字符的指针。2传递的指针有以下属性:

第一个名为__dest(名称可以省略,但给它一个名称可以提示它是什么)指向一个未知大小的内存区域,可以被函数修改。我们可以推断,因为没有__const修饰符。

第二个__src指向一个未知长度的字符串,该函数承诺不修改__const限定符。

此外,该函数假设两个指针不指向重叠区域,这是由__restrict限定符表示的。传递重叠的指针将产生undefined behaviour

示例:strcpy(buff, buff+1);通常用于从字符串中删除字符的是undefined,并且可能失败。

__THROW是特定于编译器的东西,而不是c++编译器的东西,因为C没有抛出(异常)的概念。

__nonnull ((1,2))也是编译器特定的,但我认为它是gcc的__attribute__((nonnull ((1,2)))),在这种情况下,它指示编译器,该函数从不接受NULL指针,并允许它警告如果程序员错误地试图调用它,

库函数将在.c文件中有对应于.h文件的定义。
它是关于如何在c中创建库的。首先将函数声明放在.h文件中,然后
将函数的定义放在.c文件中。
阅读如何在C和c++中创建库