高手来看看这个hello world 程序

r11222 2010-05-06 09:32:01
#include <iostream>

template <char * words>
class say
{
public:
void operator () ()
{
std::cout << words;
}
};

extern char hello[] = "Hello world!";

int main()
{
return say<hello>()(), 0;
}

请注意,这个 extern 是十分必要的,只有加上了 extern,这个指针才是一个编译器间可以确定的值,也才可以参与模板运算。还有,hello 必须为数组类型,而不能为 char*,这个道理和加 extern 是一样的。

请注意,这个 extern 是十分必要的,只有加上了 extern,这个指针才是一个编译器间可以确定的值,也才可以参与模板运算。还有,hello 必须为数组类型,而不能为 char*,这个道理和加 extern 是一样的。

int main()
{
return say<hello>()(), 0;
}

请注意,这个 extern 是十分必要的,只有加上了 extern,这个指针才是一个编译器间可以确定的值,也才可以参与模板运算。还有,hello 必须为数组类型,而不能为 char*,这个道理和加 extern 是一样的。





上面的东西我有几个地方不明白

1.为什么要加extern
2.char hello[] = "Hello world!"与 char* hello="Hello world!"有什么区别,为什么前者可以,后者不可以
3.为什么这个数组名也能参与模板运算

谢谢了!

...全文
245 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
daitounaoshi 2010-05-07
  • 打赏
  • 举报
回复
return say<hello>()(), 0;这句做的工作也太多了点吧。
还有就是你说的"为什么用char* hello 这个程序就不能成功呢".你是不是下面这样用的呢。
extern char* hello = "Hello world!";

r11222 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 bringmeback 的回复:]

刚才试了下,发现指针确实是不行的. extern 是可以去掉了,没有影响


不能用指针的原因是,模板是在编译期的,数组的地址可以在编译期间取得,所以数组名可以参于模板运算.而指针的值只能在程序运行时获取.所以指针就不能参于模板运算了.
[/Quote]

谢谢 。

大家赞成这个说法吗??
未日机甲 2010-05-07
  • 打赏
  • 举报
回复
#include <iostream>

template <char * words>
class say
{
public:
void operator () ()
{
std::cout << words;
}
};

char *hello = "Hello world!";

int main()
{
return say<&(*hello)>()(), 0;
}

但是这样却可以==
未日机甲 2010-05-07
  • 打赏
  • 举报
回复
刚才试了下,发现指针确实是不行的. extern 是可以去掉了,没有影响


不能用指针的原因是,模板是在编译期的,数组的地址可以在编译期间取得,所以数组名可以参于模板运算.而指针的值只能在程序运行时获取.所以指针就不能参于模板运算了.
r11222 2010-05-07
  • 打赏
  • 举报
回复
还是没有很好的答案...还是再顶一下...
未日机甲 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 feidaozouren 的回复:]
数组名不是指针,永远也不是,但在一定条件下,数组名可以转换为指针
[/Quote]

从C语言概念上来理解,它们确实不同.不过从实现原理上来理解,数组名只是表示了这个数组在内存中的起始位置.指针可以指向这个位置.解理原理就行了,不用在意那么多说法的.
feidaozouren 2010-05-07
  • 打赏
  • 举报
回复
数组名不是指针,永远也不是,但在一定条件下,数组名可以转换为指针
wwh159 2010-05-07
  • 打赏
  • 举报
回复
学习中
未日机甲 2010-05-07
  • 打赏
  • 举报
回复
1.为什么要加extern

extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

在这个例子中,有没有都一样,因为在同一个文件中

2.char hello[] = "Hello world!"与 char* hello="Hello world!"有什么区别,为什么前者可以,后者不可以

因为 char hello[] = "Hello world!" 创建了一个大小为strlen("Hello world!")+1的char数组,并把这个字符串保存在里面。
char* hello="Hello world!"这个只是定义了一个指针,指向的是一个常量。

#include <iostream>

template <cpnst char * words>
class say
{
public:
void operator () ()
{
std::cout << words;
}
};

extern const char *hello = "Hello world!";

int main()
{
return say<hello>()(), 0;
}
要是这样写就没有问题了

3.为什么这个数组名也能参与模板运算

数组名其实就是一个指针
未日机甲 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 r11222 的回复:]
引用 17 楼 bringmeback 的回复:

#include <iostream>

template <char * words>
class say
{
public:
void operator () ()
{
std::cout << words;
}
};

char *hello = "Hello world!";

int main()
{
……
[/Quote]

vs2005下编译,没有问题,不知道你用的什么编译器
r11222 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 bringmeback 的回复:]

#include <iostream>

template <char * words>
class say
{
public:
void operator () ()
{
std::cout << words;
}
};

char *hello = "Hello world!";

int main()
{
return say<&……
[/Quote]
一样不行。。。。。。
lxslove 2010-05-07
  • 打赏
  • 举报
回复
把extern char hello[] = "Hello world!";
改为const char * hello = "Hello world!";也可以。
其原因是template <char * words>中,words必须是常量值,必须在编译时可以计算。
kingstarer 2010-05-06
  • 打赏
  • 举报
回复
学习了 以前还不知道可以用变量名做为模板参数
r11222 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 crst_zh 的回复:]

2 .char hello[] = "Hello world!"与 char* hello="Hello world!"有什么区别??
这个说来话长,一个事变量一个是常量。google一下就明白
[/Quote]

我知道哦。。但是为什么用char* hello 这个程序就不能成功呢
r11222 2010-05-06
  • 打赏
  • 举报
回复
顶一顶,呵呵
lvshaoqing 2010-05-06
  • 打赏
  • 举报
回复
留名字。
selooloo 2010-05-06
  • 打赏
  • 举报
回复
没看出extern有啥必要,去掉一样能运行
mzlogin 2010-05-06
  • 打赏
  • 举报
回复
MARK,不懂这里的extern是干什么的。
na2650945 2010-05-06
  • 打赏
  • 举报
回复
char* 和 char[]
我能明白。
但是LZ里面讲的。
等待高手详解。
crst_zh 2010-05-06
  • 打赏
  • 举报
回复
2 .char hello[] = "Hello world!"与 char* hello="Hello world!"有什么区别??
这个说来话长,一个事变量一个是常量。google一下就明白
加载更多回复(1)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧