仅包含 header 文件中的特定定义
Include only a particular definition from header file
我使用了 string.h 库中的 strlen() 函数,但没有包含 header ,我想从最初实现的 header 文件中包含它,因为我正在写我自己的 strcpy() 实现,如果我包含 header,它表示它是 strcpy() 的多个定义。
那么如何仅包含 header 文件中的特定定义。
我需要使用 extern 关键字吗?
#include <stdio.h>
#include <stdlib.h>
#include "exercise 5.5.h"
int main() {
char *s = "hello";
char *t = "helli";
int n = 3;
if (n > strlen(t))
printf("\nsorry the value of n is greater than the size of t");
else {
S = strncpy(s, t, n);
printf("\nther is %d", x);
}
}
header 定义了 strncpy
终端跟踪
exercise. 5.5_main.c:10:7: incompatible implicit declaration of built-in function "strien
exercise 5.5 main.c:10:7: note: include <string.h> or provide a declaration of 'strlen
我不想包含 string.h 但我该如何明确提供 strlen
的定义
Header
char* strncat(char *s, char *t, int n);
char* strncpy(char *s, char *t, int n);
int strncmp(char *s,char *t, int n);
重新实现像 strcpy
这样的标准库函数可能很棘手。因为它是一个标准库函数,所以它的名称在某种意义上是 "reserved"——您不应该自己使用它。 (它不像 switch
这样的关键字那样强烈保留,但尝试编写一个名为 strcpy
的函数通常仍然是一个坏主意——更不用说它通常完全没有必要了! )
在回答您明确的问题时,不,没有办法 "selectively include" 只是您自己选择系统头文件中的声明,例如 <string.h>
.
如果出于某种原因您需要编写自己的 strcpy
版本,您有多种选择,具体取决于具体情况。
重命名您自己的函数。例如,将其命名为 my_strcpy
。 (这是通常的做法。)
确保您的函数定义完全正确,并且与标准头文件中的声明完全匹配。例如,如果您有 strcpy(char *dst, char *src) {...}
或 char *strcpy(char *dst, char *src) {...}
,它们都是错误的——它需要是 char *strcpy(char *dst, const char *src) {...}
.
也不要使用标准的 strlen
函数,这意味着您根本不必执行 #include <string.h>
。如果需要,也可以编写自己的 strlen
版本。 (如果你自己编写 strcpy
的原因是作为教学练习,这通常是要求:通常作业说 "You may not use any other functions from the standard library.")
不要因为调用 strlen
而执行 #include <string.h>
,而是在文件顶部为其提供自己的原型:extern size_t strlen(const char *);
。 (出于多种原因,这通常是一个非常糟糕的主意,除非在极端情况下并且您确切地知道自己在做什么时,否则不应采取此步骤。)
注意您遇到的 "redefinition" 错误是来自编译器还是来自 linker 可能也很重要。如果是诸如“conflicting types for 'strcpy'
”之类的编译时错误,则表示您可能需要注意上面的第 2 点。但是,如果它是一个 link-time 错误,如“ld: duplicate symbol '_strcpy'
”,那么您可能无能为力,您将不得不回到第 1 点。
我使用了 string.h 库中的 strlen() 函数,但没有包含 header ,我想从最初实现的 header 文件中包含它,因为我正在写我自己的 strcpy() 实现,如果我包含 header,它表示它是 strcpy() 的多个定义。 那么如何仅包含 header 文件中的特定定义。 我需要使用 extern 关键字吗?
#include <stdio.h>
#include <stdlib.h>
#include "exercise 5.5.h"
int main() {
char *s = "hello";
char *t = "helli";
int n = 3;
if (n > strlen(t))
printf("\nsorry the value of n is greater than the size of t");
else {
S = strncpy(s, t, n);
printf("\nther is %d", x);
}
}
header 定义了 strncpy
终端跟踪
exercise. 5.5_main.c:10:7: incompatible implicit declaration of built-in function "strien
exercise 5.5 main.c:10:7: note: include <string.h> or provide a declaration of 'strlen
我不想包含 string.h 但我该如何明确提供 strlen
的定义Header
char* strncat(char *s, char *t, int n);
char* strncpy(char *s, char *t, int n);
int strncmp(char *s,char *t, int n);
重新实现像 strcpy
这样的标准库函数可能很棘手。因为它是一个标准库函数,所以它的名称在某种意义上是 "reserved"——您不应该自己使用它。 (它不像 switch
这样的关键字那样强烈保留,但尝试编写一个名为 strcpy
的函数通常仍然是一个坏主意——更不用说它通常完全没有必要了! )
在回答您明确的问题时,不,没有办法 "selectively include" 只是您自己选择系统头文件中的声明,例如 <string.h>
.
如果出于某种原因您需要编写自己的 strcpy
版本,您有多种选择,具体取决于具体情况。
重命名您自己的函数。例如,将其命名为
my_strcpy
。 (这是通常的做法。)确保您的函数定义完全正确,并且与标准头文件中的声明完全匹配。例如,如果您有
strcpy(char *dst, char *src) {...}
或char *strcpy(char *dst, char *src) {...}
,它们都是错误的——它需要是char *strcpy(char *dst, const char *src) {...}
.也不要使用标准的
strlen
函数,这意味着您根本不必执行#include <string.h>
。如果需要,也可以编写自己的strlen
版本。 (如果你自己编写strcpy
的原因是作为教学练习,这通常是要求:通常作业说 "You may not use any other functions from the standard library.")不要因为调用
strlen
而执行#include <string.h>
,而是在文件顶部为其提供自己的原型:extern size_t strlen(const char *);
。 (出于多种原因,这通常是一个非常糟糕的主意,除非在极端情况下并且您确切地知道自己在做什么时,否则不应采取此步骤。)
注意您遇到的 "redefinition" 错误是来自编译器还是来自 linker 可能也很重要。如果是诸如“conflicting types for 'strcpy'
”之类的编译时错误,则表示您可能需要注意上面的第 2 点。但是,如果它是一个 link-time 错误,如“ld: duplicate symbol '_strcpy'
”,那么您可能无能为力,您将不得不回到第 1 点。