strcpy和其他C库函数定义在哪里(与声明相反)?

时间:2014-03-20 16:08:35

标签: c++ c

我在string.h中找到了函数strcpy的声明

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

但我在哪里可以找到此功能的定义和正文?

3 个答案:

答案 0 :(得分:4)

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

例如,GNU C Library的实现可以是found online

对于此特定功能,an SO question has been asked也是如此。

答案 1 :(得分:2)

.h个文件包含函数的声明。这意味着它是合同,告诉如何调用该函数,但在" world" C编译器。函数本身(即代码)在别处定义。它可能在另一个.c文件中,但这不是必须的。可以链接其他目标文件甚至是用其他语言编写的库。 strcpy()通常存在于stdlib中,通常用汇编语言编写。

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

此函数声明了一些对您的应用程序感兴趣的内容: extern此关键字表示此函数的定义是另一个编译单元,即它未在包含该标头的.c文件中定义。

该函数接受2个参数,这些参数是指向字符的指针并返回指向字符的指针。 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指针并允许它发出警告如果程序员错误地试图用它来调用它。

答案 2 :(得分:0)

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