C++程序设计语言练习4.2 茴字的几种写法

下述是不是定义的,为其写个定义;是定义的,为其写个声明。

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行错误的原因是:命名空间有作用域,所以里面的所有东西都必须是定义。

你可能感兴趣的:(C++,语法)