f********a 发帖数: 1109 | 1 有一段代码vector.h和vector.cc
[CODE]//vector.h
int add(int x, int y);
//vector.cc
#include
int add(int x, int y){
return (x+y);
}
int main(){
std::cout<
return 0;
}
[/CODE]
显然我不需要include "vector.h"就可以编译成功。因为编译器自动会找vector.h
但是当我用了namespace以后:
[CODE]//vector.h
namespace TEST{
int add(int x, int y);
}
//vector.cc
#include
#include "vector.h"
int TEST::add(int x, int y){
return (x+y);
}
int main(){
std::cout<
retur | t****t 发帖数: 6806 | 2 编译器不会自动找vector.h
function prototype不是必须的, 但是如果你引入namespace, 那就要先声明
【在 f********a 的大作中提到】 : 有一段代码vector.h和vector.cc : [CODE]//vector.h : int add(int x, int y); : //vector.cc : #include : int add(int x, int y){ : return (x+y); : } : int main(){ : std::cout<
| a**a 发帖数: 416 | 3 非常不幸。编译器从来不会自动找.h文件。这是因为兼容古老的c带来的混淆。
在C的石器时代,函数无须声明就可以使用,编译器也不检查你的调用方式是否正确。
编译器唯一关注的是你的函数名。所以你写add(1,1)的时候,编译器假设你有个
地方提供了add这个函数,然后自动为你生成调用代码。至于子程序被调用后是否
能正确运行,或者调用者对被调用者的返回值的假设是否正确,编译器是不管的。
到了C的古典时代,为了在编译期间就能检查出调用方式类型的错误,编译器几乎
是强制性地要求程序员提供函数调用的参数类型和返回值类型。但是为了兼容
古老的石器代码,很多C编译器在不提供函数声明的情况下,会自动根据上下文
假定一个声明,并额外地警告一下。C++的编译器也沿袭了这一传统。所以你不包含
vector.h头文件的时候,第一个main仍然可以通过。但是第二个程序的TEST::main
完全是C++代码,不可能按照C习惯来解释,TEST即可以作名字空间解,也可以作
类名解,这两个都不可像函数那样用一个符号(其背后的实质是指针或者地址)来代替。
所以必须要有头文件。
简单地说,你的第一个程序是碰巧对了,第二个程序
【在 f********a 的大作中提到】 : 有一段代码vector.h和vector.cc : [CODE]//vector.h : int add(int x, int y); : //vector.cc : #include : int add(int x, int y){ : return (x+y); : } : int main(){ : std::cout<
| f******y 发帖数: 2971 | 4 A simple explanation: you never told the compiler what TEST is. |
|