老鸟问一个初学者有关问题。
老鸟问一个菜鸟问题。。。。
好久没有写代码,今天被一个问题难道了,虽然知道怎么解决,但是还是有点不太明白。
比如我有4个文件:
文件一:a.h
#ifndef __AAA_H
#define __AAA_H
int max(int a, int b)
{
return a > b ? a : b;
}
#endif
文件2:b.cpp
#include "a.h"
int getMax(int a, int b)
{
return max(a, b);
}
文件3:c.cpp
#include "a.h"
int getvalue(int a, int b)
{
return max(a, b);
}
文件4:main.cpp
#include <stdio.h>
#include <stdlib.h>
extern int getvalue(int a, int b);
int main(int argc, char *argv[])
{
printf("getval:%d.\n", getvalue(10, 20));
return 1;
}
g++ -o x b.cpp c.cpp main.cpp
c.cpp:(.text+0x0): multiple definition of `max(int, int)'
为啥会报重复定义?a.h中的 #ifndef 这个东西没起作用了?
------解决思路----------------------
请遵循.h文件中写函数原型,.cpp文件中实现函数的通行做法。
------解决思路----------------------
非要在头文件里写函数体,请用static inline
不论是#ifndef还是#pragma once都只保证头文件在一个编译单元中只出现一次,然而你的程序至少有3个编译单元
------解决思路----------------------
头文件引用一次只局限于某个cpp文件来说的。比如a.h这个文件,当编译器编译b.cpp时保证a.h只被include一次;当编译器编译c.cpp时保证a.h只被include一次,这是ifndef...define...endif的作用。因为每个cpp都要生成一个临时的o文件,当编译b.cpp时,max函数被编译到b.o中,当编译c.cpp时,max函数被编译到c.o中,当编译main.cpp时,找不到max的定义需要链接,最终在链接阶段,max同时出现在b.o和c.o中,报错,重定义。所以你的问题就是不要在头文件中出现函数,对象,数值之类的定义,容易产生重定义的问题。
------解决思路----------------------
a.h
b.cpp c.cpp
main.cpp
如果单独编译b c是没问题的,可是你选择的一起编译,这就造成了头文件重复引用
好久没有写代码,今天被一个问题难道了,虽然知道怎么解决,但是还是有点不太明白。
比如我有4个文件:
文件一:a.h
#ifndef __AAA_H
#define __AAA_H
int max(int a, int b)
{
return a > b ? a : b;
}
#endif
文件2:b.cpp
#include "a.h"
int getMax(int a, int b)
{
return max(a, b);
}
文件3:c.cpp
#include "a.h"
int getvalue(int a, int b)
{
return max(a, b);
}
文件4:main.cpp
#include <stdio.h>
#include <stdlib.h>
extern int getvalue(int a, int b);
int main(int argc, char *argv[])
{
printf("getval:%d.\n", getvalue(10, 20));
return 1;
}
g++ -o x b.cpp c.cpp main.cpp
c.cpp:(.text+0x0): multiple definition of `max(int, int)'
为啥会报重复定义?a.h中的 #ifndef 这个东西没起作用了?
------解决思路----------------------
请遵循.h文件中写函数原型,.cpp文件中实现函数的通行做法。
------解决思路----------------------
非要在头文件里写函数体,请用static inline
不论是#ifndef还是#pragma once都只保证头文件在一个编译单元中只出现一次,然而你的程序至少有3个编译单元
------解决思路----------------------
头文件引用一次只局限于某个cpp文件来说的。比如a.h这个文件,当编译器编译b.cpp时保证a.h只被include一次;当编译器编译c.cpp时保证a.h只被include一次,这是ifndef...define...endif的作用。因为每个cpp都要生成一个临时的o文件,当编译b.cpp时,max函数被编译到b.o中,当编译c.cpp时,max函数被编译到c.o中,当编译main.cpp时,找不到max的定义需要链接,最终在链接阶段,max同时出现在b.o和c.o中,报错,重定义。所以你的问题就是不要在头文件中出现函数,对象,数值之类的定义,容易产生重定义的问题。
------解决思路----------------------
a.h
b.cpp c.cpp
main.cpp
如果单独编译b c是没问题的,可是你选择的一起编译,这就造成了头文件重复引用