【问题标题】:Include Guard Problem in C (Compiler still reports redefiniton errors)在 C 中包含 Guard 问题(编译器仍然报告重定义错误)
【发布时间】:2020-04-21 23:56:05
【问题描述】:

正如标题所说,我在使用包含防护时遇到问题。我不确定我是否正确使用它们,所以我已经检查了几个相关的帖子,它们都包含似乎与我相同的代码。请告诉我我使用包含守卫有什么问题。

对于上下文,我有几个我希望能够在其他程序中使用的头文件,因为这多个文件包含相同的依赖项头(一个linkedList 文件),这就是问题出现的地方。即使我似乎有包含守卫,编译器仍然报告代码有重新定义错误。下面是不起作用的包含防护。

 #ifndef UNI_LINKED_LIST_LIB_H
 #define UNI_LINKED_LIST_LIB_H "uniLinkedListLibV02.h"
 #include UNI_LINKED_LIST_LIB_H
 #endif

我的理解是,如果我尝试多次包含此标头,#ifndef 将返回 false。并且在第一个包含它应该定义 UNI_LINKED_LIST_H 然后包含库。

【问题讨论】:

  • 如果保护是针对您尝试包含的.h 文件,请不要尝试定义保护变量。将您显示的所有内容替换为简单的:#include "uniLinkedListLibV02.h"。包含的文件有责任处理 保护变量
  • 这是我不知道的。谢谢。

标签: c include include-guards


【解决方案1】:

这是一个带有保护的.h 文件:

// guard.h -- include file with a guard

#ifndef GUARD_H
#define GUARD_H

#define SPECIAL_VALUE   23

#endif

这是一个使用它的.c 文件:

// main.c -- program that includes the guarded file

#include <stdio.h>

#include "guard.h"

int
main(void)
{

    printf("%d\n",SPECIAL_VALUE);

    return 0;
}

这是一个.c 文件,其中包含错误的文件:

// bad.c -- program that includes the guarded file _incorrectly_

#include <stdio.h>

// do _not_ do this:
#ifndef GUARD_H
#define GUARD_H
#include "guard.h"
#endif

int
main(void)
{

    printf("%d\n",SPECIAL_VALUE);

    return 0;
}

【讨论】:

  • 感谢您的回答。我只是将帖子答案换成了这个答案,因为它也提供了关于不该做什么的信息。
  • 关键的坏点是包含代码中的#define GUARD_H。标头仍必须包含标头保护。如果在包含标头之前定义GUARD_H,编译器将看不到标头的内容。从调用代码中省略 #define GUARD_H 会将您带到灰色区域。如果标头保护名称很容易从标头名称中推断出来,您可以通过在标头周围使用 #ifndef / #endif 来稍微优化构建,但它很快就会变得太麻烦而不值得。您需要将每个 #include 用额外的两行包装起来……可能可以,但可能不行。
【解决方案2】:

这就是你所需要的:

 #ifndef UNI_LINKED_LIST_LIB_H
 #define UNI_LINKED_LIST_LIB_H 
 #include "uniLinkedListLibV02.h"
 rest of code goes here
 #endif

你只需要定义UNI_LINKED_LIST_LIB_H,值无关紧要。

【讨论】:

  • 谢谢。现在一切看起来都更干净了。此外,我发现一些代码的顺序错误也导致了问题。
  • 这不是包含防护的实现方式。守卫应该在被包含的文件中,以便无论包含文件是否实现它,它们都会运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多