下述是不是定义的,为其写个定义;是定义的,为其写个声明。
char ch;
string s;
int count = 1;
const double pi = 3.1415926;
extern int error_number;
const char *name = "Njal";
const char *season[] = {"spring","summer","fall","winter"};
struct Date{int d,m,y;};
int day(Data *p) {return p->d;}
double sqrt(double);
template<class T>T abs(T a){return a<0?-a:a;}
typedef complex<short> Point;
struct User;
enum Beer{Carlsberg,Tuborg,Thor};
namespace NS{int a;}
我自己的初版答案:
1.sd ---- extern char ch; 正确
2.sd ---- extern string s; 正确
3.sd ---- extern int count; 正确
4.sd ---- extern const double pi; 正确
5.s ---- int error_number; 正确
6.sd ---- extern const char *name; 正确
7.sd ---- extern const char*season[]; 正确
8.sd ---- extern struct Data;
不正确
9.sd ---- int day(Data*); 正确
10.s ---- double sqrt(double d) {return d;} 正确
11.s ---- int abs(int);
不正确
12.s ---- Point p;
不正确
13.s ---- struct User{char *name; char* pwd;}; 正确
14.sd --- Beer beer;
不正确
15.没有理论支持,写不出答案
理论依据:
- 对于对象(变量),如果没有先导的关键字extern,或者它带有一个初始式,这个声明就是一个定义。
- 函数声明如果带有函数体,那就是定义
- 一个class、struct、union或enum如果带有其所有成员的声明,那么它就是一个定义。
- 本质上,类模板和函数模板也遵循类和函数的有关规则。
8行错误的原因是:结构体是进行的类型定义,并不是变量定义。对于类型声明,只用struct Data就可以了。类声明也是如此,如class A;相似的还有枚举和联合。
11行错误的原因是:模板函数的声明遵循普通函数格式和规则。
12行错误的原因是:针对类型进行定义
14行错误的原因是:针对类型进行定义
15行错误的原因是:命名空间有作用域,所以里面的所有东西都必须是定义。