其中定义了stry和其他C库函数(与声明相反)
Where are strcpy and other C library functions defined (as opposed to declared)?
我发现函数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++中创建库
- Visual Studio中的函数声明和函数定义问题
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- 有没有一个 c++ gmp 库函数与 python gmpy2 库 divm(..) 函数相同?
- 未在此作用域中声明的函数和变量 (C++)
- 用"=default"声明的函数应该只在头文件中执行
- 无法重新声明构造函数.为什么?
- 好友库函数可以访问子数据
- 覆盖程序中的标准 C 库函数C++
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 当我尝试在函数内声明一个函数时,它不起作用?有什么建议吗?*源代码如下*
- 如何使用模板声明成员函数?(不是模板类)
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 返回time()库函数的数据类型
- 将C++中的多个参数传递给MatLab共享库函数
- 未定义与已删除与未声明的函数
- C/C++:一个奇怪的库函数声明
- 为什么我不能使用.so库中声明的函数
- 其中定义了stry和其他C库函数(与声明相反)