标签: include-guards

棘手的包括C的情况

我有一个名为cpu.h的文件,其中包含另外两个名为register.h和addrmode.h的头文件.在cpu.h中定义了一个cpu_t结构,它们包含了对它们的功能的需求.我尝试在其他两个包含文件中包含cpu.h,但不包含任何内容.我猜他们不包括在内,因为在cpu.h中设置了包含警戒.有谁知道如何解决这个问题?

c include-guards include

1
推荐指数
1
解决办法
419
查看次数

代码保护失败

拿这个文件:

#ifndef A_H
#define A_H

char EL[] = "el";
#endif
Run Code Online (Sandbox Code Playgroud)

a.cpp

#include "a.h"
Run Code Online (Sandbox Code Playgroud)

BH

#ifndef B_H
#define B_H

#include "a.h"

#endif
Run Code Online (Sandbox Code Playgroud)

b.cpp

#include "b.h"
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "b.h"
#include "a.h"

int main() { }
Run Code Online (Sandbox Code Playgroud)

这只是一个例子,但我真的有这个问题:

g++ -c a.cpp
g++ -c b.cpp
g++ -c main.cpp
g++ -o main main.o a.o b.o


a.o:(.data+0x0): multiple definition of `EL'
main.o:(.data+0x0): first defined here
b.o:(.data+0x0): multiple definition of `EL'
main.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

为什么以及如何解决?

c c++ include-guards linker-errors multiple-definition-error

1
推荐指数
1
解决办法
194
查看次数

C++ - 如何避免此标题出现两次?

在:http://www.learncpp.com/cpp-tutorial/110-a-first-look-at-the-preprocessor/

在Header guards下,有一些代码片段:

add.h:

#include "mymath.h"
int add(int x, int y);
Run Code Online (Sandbox Code Playgroud)

subtract.h:

#include "mymath.h"
int subtract(int x, int y);
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#include "add.h"
#include "subtract.h"
Run Code Online (Sandbox Code Playgroud)

我怎样才能避免#include "mymath.h"出现两次main.cpp

谢谢.

c++ header include-guards

0
推荐指数
1
解决办法
3124
查看次数

头文件包含循环和多重定义

我有一个util.h包含一个函数,它将用于a.h和'b.h',以及更多,a.h并将b.h相互包含,以便访问彼此定义的一些类.

//util.h

#ifndef _UTIL_H_
#define _UTIL_H_

#include <iostream>

void foo()
{
    std::cout << "foo\n";
}

#endif

//a.h, it has a a.cpp
#ifndef _A_H_
#define _A_H_

#include "util.h"
#include "b.h"

//some classes' definition

#endif

//b.h, it has a b.cpp
#ifndef _B_H_
#define _B_H_

#include "util.h"
#include "a.h"

//some classes' definition

#endif
Run Code Online (Sandbox Code Playgroud)

我的问题是,我得到了multiple definition错误foo.怎么样?

我认为问题可能是,a.h包括util.hb.h,并再次b.h包括util.h,所以我得到了多个def错误.但它似乎没有意义,因为在util.h我写#ifndef/#define卫兵.

任何人都可以给我一个帮助,谢谢.

c++ include-guards multiple-definition-error

0
推荐指数
1
解决办法
3028
查看次数

如果目标文件已经有头文件保护,我们应该使用#ifndef保护#include吗?

假设我们有两个类,Foo和Bar.

在Foo.h中

#ifndef MYPROJ_FOO
#define MYPROJ_FOO
....
# endif 
Run Code Online (Sandbox Code Playgroud)

在Bar.cpp中,我们还需要保护包括如

#ifndef MYPROJ_FOO
#include <Foo.h>
#endif
Run Code Online (Sandbox Code Playgroud)

还是简单#include 就足够了?如果我们已经有头球防守队员,那么对我来说似乎是多余的,但是我经常看到这样的练习,因此想知道我是否遗漏了什么.谢谢!

c++ macros include-guards c-preprocessor

0
推荐指数
1
解决办法
171
查看次数

C问题包括警卫

我有一个包含防护设置的头文件.我的项目中有多个C文件,需要这个头文件进行编译.当我去编译但是我得到一个错误,说该函数已经包含在另一个文件中.包括警卫不应该阻止这种情况发生吗?从理论上讲,我相信我应该能够多次导入这个文件而没有这个问题.

#ifndef __BST_INCLUDED
#define __BST_INCLUDED__

//bunch of code here

#endif
Run Code Online (Sandbox Code Playgroud)

错误:

bst.h:22:13: error: conflicting types for ‘pruneBSTNode’
 extern void pruneBSTNode(bst *tree,bstNode *node);
             ^
In file included from vbst.h:5:0,
                 from bstrees.c:7:
Run Code Online (Sandbox Code Playgroud)

c header include-guards include

0
推荐指数
1
解决办法
258
查看次数

为什么在C分叉的情况下,即使有防护措施,我的文件也执行两次此标头?

即使有警卫人员到位,我的文件仍在尝试两次执行mkdir。

我尝试将ifndef放在另一个c文件中,但仍执行两次

酸碱度

#ifndef P_H
#define P_H

void p1(char* filepath, int m);


#endif
Run Code Online (Sandbox Code Playgroud)

main.c

#include "main.h"// includes ifndef with p1.h inside it

int main(int argc, char *argv[]){

    p1("Hi",2);

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

第1版

#include "phase1.h"
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

void p1(char* filepath, int m){
    pid_t cpid;
    cpid = fork();
    if ((cpid = fork()) == -1) {
        perror("fork failed");
    }
    if(cpid > 0){
        wait(NULL);
    }
    else{
        char *makeDir[] = {"mkdir", "MyNewDirectory", NULL};
        execvp(makeDir[0],makeDir);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我执行gcc …

c fork header include-guards execvp

0
推荐指数
1
解决办法
39
查看次数

C:外部变量声明和包含守卫

关于在头文件中声明变量,我遇到了与这两篇文章(第一篇第二篇)中描述的相同的问题。列出的解决方案对我来说效果很好,但我对解决方案有一个基本问题:

为什么包含守卫仍然不能解决这个问题?如果我多次包含相同的头文件,我希望包含守卫会避免多次声明我的变量。

c include-guards include

0
推荐指数
1
解决办法
68
查看次数

多次#included 保护头文件如何位于不同的翻译单元内?

我知道 #inclusion 通常被描述为文本复制粘贴预处理器指令。现在,如果标头受到 #include 保护或 #pragma 一次,那么我们如何描述第一个翻译单元之后实际发生的情况到 #include 所述标头?

c++ include-guards include visual-studio translation-unit

0
推荐指数
1
解决办法
389
查看次数