由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问一个简单的C++问题
相关主题
如何快速学习R或Python这类开源类语言的加盟包?魏老师图灵奖级别的分布式理论在此
相关话题的讨论汇总
话题: int话题: test话题: add话题: code话题: std
进入Programming版参与讨论
1 (共1页)
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.
1 (共1页)
进入Programming版参与讨论
相关主题
如何快速学习R或Python这类开源类语言的加盟包?魏老师图灵奖级别的分布式理论在此
相关话题的讨论汇总
话题: int话题: test话题: add话题: code话题: std