免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: fender0107401
打印 上一主题 下一主题

[C] 我觉得在C里面static和register是2个有点搞笑的特性。 [复制链接]

论坛徽章:
0
71 [报告]
发表于 2011-02-23 21:42 |只看该作者
我是为了赚积分,发帖求助的。。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
72 [报告]
发表于 2011-02-23 22:42 |只看该作者
回复 70# 幻の上帝

>> 不过有点奇怪标准的措辞,用unnamed而不用anonymous,倒是union是用anonymous的……
我是看许多中文资料的说法是 "匿名名字空间" , 想当然以为是 anonymous 了……
C++标准太庞大……    没能仔细研读……  惭愧……


我觉得 scope 与 linkage 是两个概念吧?

int e = 12;
static int s = 26;

两者在C中都是文件作用域, 但前者是外部链接, 后者是内部链接。

严格的说, C当中是没有全局变量的。
对比elisp, 在toplevel里: (set 'gloabl-value 12)
这才是全局变量, 任何其他代码都可以访问它。

而C里面, 即使x.c包含上面两个定义, 即使x.o被链接, 其他翻译单元依然是不能访问e的。
至少要 extern int e; 去声明才行。


而C++这个 global namespace 我感觉 global 重点是指它的 scope , 而不是 linkage 。

int x = 12;
namespace ns { int x = 26;  }
void f() {
    int x = :: x = ns:: x;
    ...

感觉global namespace 是因为C++引入了namespace 而增加的概念。
C里面, 文件作用域的 int x; 就和 :: x 差不多了, 也会被局部遮盖。
只是C里面没有C++的namespace(C自己有另一种namespace的概念), 所以不需要引入专门的global namespace的说法。
似乎叫 root namespace 更恰当?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
73 [报告]
发表于 2011-02-23 22:45 |只看该作者
回复 1# fender0107401

既然说到elisp……
lz啊, 要是你用emacs, 熟悉elisp的话……
我保证你会十分想念static的……

至于register, 要回到以前那个年代去考虑问题了。
某段时间里, 编译器还被认为是不可能完整的任务呢……

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
74 [报告]
发表于 2011-02-23 23:13 |只看该作者
回复 73# OwnWaterloo

我不喜欢emacs,不知道怎么回事,反正就是用着别扭,看着难受,可能是先入为主的原因吧。

我就喜欢最大化的gVim,再加上DejaVu Mono字体,然后就使用默认的配色,

写C的时候就开一个侧边栏,写LaTeX的时候就不怎么开那个侧边栏。

至于static吗,我还是少用的好,如果项目里面有2个函数重名的话,我首先不喜欢,然后我用的FreeBSD基本系统里面的ctags也会出警告(我遇见过,但是不是为了测试static这个关键字),还是靠前缀搞定比较踏实。

至于register吗,感觉有点鸡肋,感觉还是少用吧,没有那个功夫琢磨给那个变量加这个关键字,而且你加了也不是一定好使,干脆就忽略了得了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
75 [报告]
发表于 2011-02-23 23:33 |只看该作者
回复 74# fender0107401

我也觉得它别扭, 主要是觉得elisp别扭……
只能靠前缀……

后果就是长长的变量名, 函数名……
看着难受…… 写着更难受……

前缀真的靠谱么?

C里面的名字其实只保证最前面若干个是不会有歧义, 后面就不保证了。
C89外部名只保证6个字母, C99是31个。
不过那些过于老旧的系统, 确实应该让它们被淘汰了……

不说C, 说elisp。
想写一些elisp代码, 增强现有libX的功能。
该用个什么前缀? X-y?  万一以后libX 使用了 X-y 这个名字怎么办?
用自己的名字?  就这么点垃圾代码还用自己的名字, 太张扬了……

取个好名字难啊……
关键是, 现在的问题是: 只想让这些名字在某个特定范围内被使用
直接限定它们的作用域的机制: static, lexical-let, label才是靠谱的。
而前缀, 反而不是直面这个问题, 而是一种workaround

说实话, 我是非常不理解坚持 free(p); p = NULL; 的人为什么会对static反感……
static才应该更有安全感才对……


至于register, 以前编译技术不发达的时候应该是能起到作用的。
Gates 说: 640k is enough……  他是不是很搞笑?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
76 [报告]
发表于 2011-02-23 23:42 |只看该作者
回复 74# fender0107401

你喜欢vim是吧?  嘿嘿。

vi的模式就是一种作用域。

键盘上的键就只有这么多个, 虽然它们的组合也是无穷的, 但是使用组合键会导致击键过多 —— the emacs approach。

而vi使用不同的模式。
每个键在不同的模式之下的含义就可以不同。
这样, 击键序列就可以比较简短, 因为有模式(作用域)来限定它的含义。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
77 [报告]
发表于 2011-02-23 23:47 |只看该作者
回复 75# OwnWaterloo

我也知道C语言对identifier的长度是有限制的,

所以有的时候也在担心命名是否过长,但是到现在为止还没有出什么乱子,

而且我这个命名啊,是系统命名法,不是乱起名的,

但是必须承认,刚刚发这个贴的时候我对static的理解还是很不到位,

但是现在想想,可能还是难以应用在我的项目里面,

第一是我不喜欢一个项目里面有两个函数同名,这个我感觉别扭。虽说是不同模块的,我也受不了。

不一样的名就得干不一样的事,一样的名就得干一样的事,防止我脑子乱。

第二是我担心像cscope这种工具会不会找不着北。

至少我用的ctags已经找不着北了。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
78 [报告]
发表于 2011-02-23 23:54 |只看该作者
回复 76# OwnWaterloo

你应该这么说,

Vi/Vim使用模式,所以键盘处理能力按照n*n*n的复杂性增长。

Emacs使用组合键,所以键盘处理的能力是n+(n-1)+n(n-2)的复杂性增长。

所以同样是实现100中组合的话,

Vi/Vim只需要100^(1/3)个键,

Emacs就不好说了,

所以我在Vim里面感觉不怎么费时间在操作上。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
79 [报告]
发表于 2011-02-23 23:57 |只看该作者
回复 77# fender0107401

>> 不一样的名就得干不一样的事,一样的名就得干一样的事,防止我脑子乱。

那vi里面, j就必须是插入一个字符'j'或者是下移一行之一, 不得两者兼有。
好吗

>> 第二是我担心像cscope这种工具会不会找不着北。
>> 至少我用的ctags已经找不着北了。

这是工具自身的问题。
这两个工具其实都是猜测(guess) 而非理解(understand)语法。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
80 [报告]
发表于 2011-02-24 00:01 |只看该作者
回复 79# OwnWaterloo


哈哈,也对啊,

不过我现在在Vim里面都不怎么走脑子了,都习惯了,常用的就那几个操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP