【发布时间】:2018-11-25 20:38:26
【问题描述】:
我使用了 string.h 库中的 strlen() 函数,但没有包含我想从最初实现的头文件中包含的头文件,因为我正在编写自己的 strcpy() 实现,如果我包含标题它说它是strcpy()的多个定义。 那么如何仅包含头文件中的特定定义。 我需要使用 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);
}
}
头部有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 的定义
标题
char* strncat(char *s, char *t, int n);
char* strncpy(char *s, char *t, int n);
int strncmp(char *s,char *t, int n);
【问题讨论】:
-
你不能按照C标准,它是一个保留名称。您可以禁止标准库并仅使用您的功能。您还可以创建一个包含您的实现的库并预加载它以强制程序使用它。如果没有minimal reproducible example,就很难确切知道您尝试了什么以及您需要什么。目前,我会告诉你这个问题与header无关。
-
感谢您的更新,我想您尝试做一个练习,您可以将它包含在您的问题中吗?因为正如我所说,您不允许在 C 标准中定义自己的
strlen()函数。我怀疑你的练习会问你这个问题。例如,您确定您的示例告诉您将函数命名为strlen()而不是例如my_strlen()吗? -
另外,要发布完整的minimal reproducible example,您需要在问题中提供头文件“exercise 5.5.h”。
-
您不需要相同的名称。要么你不这样做,因为你的任务不需要它。或者您不需要为要覆盖的函数使用不同的原型,在这种情况下,您可以简单地重写具有相同名称和原型的 strcpy。如果您不想使用相同的原型,那么您也不想使用相同的名称。否则,您如何让该函数的所有其他用户使用同名的新原型?
-
用与标准库函数相同的名称编写自己的函数是非常糟糕的做法。你可以,但这是支持的噩梦。如果你真的愿意,C 不会阻止你成为一个糟糕的程序员,但你为什么要这样做呢?