【问题标题】:Include only a particular definition from header file仅包含头文件中的特定定义
【发布时间】: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 不会阻止你成为一个糟糕的程序员,但你为什么要这样做呢?

标签: c header string.h


【解决方案1】:

重新实现像strcpy 这样的标准库函数可能很棘手。因为它是一个标准库函数,它的名字在某种意义上是“保留的”——你不应该自己使用它。 (它没有像switch 这样的关键字那么强烈保留,但尝试编写一个名为strcpy 的函数通常仍然是个坏主意——更不用说它通常完全没有必要!)

在回答您的明确问题时,不,没有办法“选择性地包含”您自己选择的系统头文件中的声明,例如&lt;string.h&gt;

如果出于某种原因您需要编写自己的strcpy 版本,您有多种选择,具体取决于具体情况。

  1. 重命名您自己的函数。例如,称它为my_strcpy。 (这是通常的做法。)

  2. 确保您的函数定义完全正确,并且与标准头文件中的声明完全匹配。例如,如果您有strcpy(char *dst, char *src) {...}char *strcpy(char *dst, char *src) {...},它们都是错误的——它必须是char *strcpy(char *dst, const char *src) {...}

  3. 也不要使用标准的strlen 函数,这意味着您根本不需要使用#include &lt;string.h&gt;。如果需要,也可以编写自己的 strlen 版本。 (如果您编写自己的 strcpy 是为了作为教学练习,这通常是要求:作业通常说“您不得使用标准库中的任何其他函数。”)

  4. 不要因为调用 strlen 而执行 #include &lt;string.h&gt;,而是在文件顶部为其提供自己的原型:extern size_t strlen(const char *);。 (出于多种原因,这通常是一个非常糟糕的主意,除非在极端情况下并且当您确切知道自己在做什么时,否则不会采取步骤。)

注意您得到的“重新定义”错误是来自编译器还是链接器也可能很重要。如果是编译时错误,例如“conflicting types for 'strcpy'”,则表示您可能需要注意上面的第 2 点。但如果是“ld: duplicate symbol '_strcpy'”之类的链接时错误,您可能无能为力,您将不得不退回到第 1 点。

【讨论】:

    猜你喜欢
    • 2015-01-03
    • 2021-09-19
    • 2015-12-25
    • 2014-01-28
    • 2019-02-05
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    相关资源
    最近更新 更多