一个头文件,声明的函数、类型、结构体等,只能于一个源文件实现。
包含同一个头文件的多个源文件,不能定义相同名称的全局变量,即便类型不同也不可以。(但常量却可以)。
包含同一个头文件的多个源头件,可以分别在源文件中声明并定义类型、结构体,但不能申明并定义函数。但这却会导致一个有趣的问题,请看实例分析。
A.h 声明了3个函数,分别在B.cpp C.cpp D.cpp 中实现
/*
* File: main.cpp
* Author: Vicky
*
*/
#include "A.h"
/*
*
*/
int main(void) {
hello1();
hello2();
hello3();
return 0;
}
B.cpp
#include "A.h"
#include <iostream>
/**
* 在源文件中声明并一定Human类
*/
class Human {
public:
void say() {
std::cout << "B.cpp Human say" << std::endl;
}
};
void hello1() {
std::cout << "B.cpp hello1" << std::endl;
Human h;
h.say();
}
C.cpp
#include "A.h"
#include <iostream>
/**
* 在源文件中声明并一定Human类
*/
class Human {
public:
void say() {
std::cout << "C.cpp Human say" << std::endl;
}
};
void hello2() {
std::cout << "C.cpp hello2" << std::endl;
Human h;
h.say();
}
D.cpp
#include "A.h"
#include <iostream>
/**
* 在源文件中声明并一定Human类
*/
class Human {
public:
void say() {
std::cout << "D.cpp Human say" << std::endl;
}
};
void hello3() {
std::cout << "D.cpp hello3" << std::endl;
Human h;
h.say();
}
可见,B.cpp C.cpp D.cpp 都包含A.h并且分别实现了A.h中的void hello1();void hello2();void hello3(); 3个函数,最重要的是,它都声明并一定了Human类。
main.cpp
/*
* File: main.cpp
* Author: Vicky
*
*/
#include "A.h"
/*
*
*/
int main(void) {
hello1();
hello2();
hello3();
return 0;
}
编译器不会抛出任何异常并且不提示任何警告。执行程序后,结果却不如我预期那样,结果为:
真实结果 预期结果
B.cpp hello1 B.cpp hello1
D.cpp Human say B.cpp Human say
C.cpp hello2 C.cpp hello2
D.cpp Human say C.cpp Human say
D.cpp hello3 D.cpp hello3
D.cpp Human say D.cpp Human say
而且,在linux下无使用vc在windows下编译执行的结果都不相同,但无外乎Human类是一个。
使vc编译时:
1>ClCompile:
1> main.cpp
1> D.cpp
1> C.cpp
1> B.cpp
B.cpp hello1
B.cpp Human say
C.cpp hello2
B.cpp Human say
D.cpp hello3
B.cpp Human say
分析,D编译后,创建了Human类,但C编译后,C中的Human类替换了D的Human,而最后编译的B中的Human又替换掉了C中的Human,顾导致最后Human类为B源文件中的Human类。为了证明这一点,在linux下使用g++编译源文件.
g++ B.cpp C.cpp D.cpp main.cpp
B.cpp hello1
B.cpp Human say
C.cpp hello2
B.cpp Human say
D.cpp hello3
B.cpp Human say
g++ C.cpp B.cpp D.cpp main.cpp
B.cpp hello1
C.cpp Human say
C.cpp hello2
C.cpp Human say
D.cpp hello3
C.cpp Human say
g++ D.cpp B.cpp C.cpp main.cpp
B.cpp hello1
D.cpp Human say
C.cpp hello2
D.cpp Human say
D.cpp hello3
D.cpp Human say
g++ D.cpp B.cpp C.cpp main.cpp
总结:包含同一个头文件的多个源头件,可以分别在源文件中声明并定义类型、结构体,但切记,类型及结构体不要定义相同名称!!!
当多个源文件包含相同的头文件,并声明并定义相同名称的类和函数时,编译结果可能因编译顺序而异。在Linux和Windows下,编译器表现不同,可能导致不同源文件的类实现被覆盖。例如,A.h声明的hello1(), hello2(), hello3()函数和Human类,分别在B.cpp, C.cpp, D.cpp中实现,但在main.cpp中调用时,输出显示Human类的行为受最后编译的源文件影响。这表明编译器链接阶段的行为对结果有直接影响。"
122039226,11588909,电大中专营销策划原理与实务试题解析,"['营销策划', '教育', '考试题库']

被折叠的 条评论
为什么被折叠?



