我在string.h中找到了函数strcpy
的声明
/* Copy SRC to DEST. */
extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
__THROW __nonnull ((1, 2));
但我在哪里可以找到此功能的定义和正文?
答案 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 ++中创建库的信息。