我有一个名为cpu.h的文件,其中包含另外两个名为register.h和addrmode.h的头文件.在cpu.h中定义了一个cpu_t结构,它们包含了对它们的功能的需求.我尝试在其他两个包含文件中包含cpu.h,但不包含任何内容.我猜他们不包括在内,因为在cpu.h中设置了包含警戒.有谁知道如何解决这个问题?
拿这个文件:
啊
#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
在: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?
谢谢.
我有一个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.h和b.h,并再次b.h包括util.h,所以我得到了多个def错误.但它似乎没有意义,因为在util.h我写#ifndef/#define卫兵.
任何人都可以给我一个帮助,谢谢.
假设我们有两个类,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文件,需要这个头文件进行编译.当我去编译但是我得到一个错误,说该函数已经包含在另一个文件中.包括警卫不应该阻止这种情况发生吗?从理论上讲,我相信我应该能够多次导入这个文件而没有这个问题.
#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) 即使有警卫人员到位,我的文件仍在尝试两次执行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 …
我知道 #inclusion 通常被描述为文本复制粘贴预处理器指令。现在,如果标头受到 #include 保护或 #pragma 一次,那么我们如何描述第一个翻译单元之后实际发生的情况到 #include 所述标头?