猿问

为什么我的包含保护不阻止递归包含和多个符号定义?

为什么我的包含保护不阻止递归包含和多个符号定义?

两个常见问题包括警卫:

  1. 第一个问题:

    为什么不包括保护我的头文件的警卫相互的、递归的包含?每当我写下面这样的东西时,我总是会收到关于不存在的符号的错误,这些符号显然是存在的,甚至是更奇怪的语法错误:

    “A.H”

    #ifndef A_H#define A_H#include "b.h"...#endif // A_H

    “B.H”

    #ifndef B_H#define B_H#include "a.h"...#endif // B_H

    “main.cpp”

    #include "a.h"int main(){
        ...}

    为什么我在编译“main.cpp”时出错?我需要做些什么来解决我的问题?


  1. 第二个问题:

    为什么不包括守卫多重定义?例如,当我的项目包含两个包含相同标题的文件时,有时链接器会抱怨某个符号被多次定义。例如:

    “Header.h”

    #ifndef HEADER_H#define HEADER_Hint f(){
        return 0;}#endif // HEADER_H

    “Source1.cpp”

    #include "header.h"...

    “Source2.cpp”

    #include "header.h"...

    为什么会发生这种事?我需要做些什么来解决我的问题?


慕侠2389804
浏览 395回答 2
2回答

弑天下

首先,你应该100%地确定你在“包括守卫”中没有副本。用这个命令grep -rh "#ifndef" * 2>&1 | uniq -c | sort -rn | awk '{print $1 " " $3}' | grep -v "^1\ "你将1)高亮显示所有包含护卫,得到唯一的行与计数器按包含名称,排序结果,只打印计数器和包括名称,并删除那些是真正唯一的。提示:这相当于获得重复的包含名称的列表。
随时随地看视频慕课网APP
我要回答