Objective-C中const常量是外连接的
来源:互联网 发布:plc编程培训学校 编辑:程序博客网 时间:2024/04/30 17:39
前几天老师要求实现一个iphone上的“吃豆人”小游戏,给一下午加一晚上的时间。由于粟的设计很合理,且没有考虑太多、太复杂的情况(如 pacman 吃了 magic dot 后所有ghost的速度应该变慢),总体上没遇到什么太大的困难——只是在开发过程中曾遇到一个很诡异的错误:
为了遵循DRY原则,我把公用常量(ghost的数量)定义放在了一个define.h文件中,让大家都去import该文件。
当时我的常量定义是这样写的:
const int NUMOFGHOST = 4;
加完这句就出问题了,点击"build and run"按钮后报了一个错误,打开看后发现是一个从未见过的错误:
Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1
当时感觉很不解,不知怎么加了这一句后gcc会非正常退出,由于时间比较紧就没有多想,直接改用宏定义了这个常量。
后来小游戏做得热火朝天(各种恶搞,给“吃豆人”加上了dota里的各种声音,背景音乐用的是亡灵序曲),也就忘了这个事了。
昨天看《高质量程序设计指南——C++/C语言》看到了C++与C中const关键字之不同时顿时想起了那个诡异的问题,同时也找到了答案。
书中说在标准C中const定义的变量是外连接的,即如果一个编译单元中定义了一个全局const常量,则其在其他编译单元中是可见的,如果其他编译单元也定义了同名const常量就会产生重复定义错误。这一点与C++不同,C++中const定义的变量是内连接的,即每个编译单元定义的全局const常量是自己独有的。
Objective-C是标准C的另一种扩展,那么我犯的错误也就很明显了——当多个编译单元都引用那个define.h文件时出现了重复定义错。
今天来到机房一试,果然如此,只要将
const int NUMOFGHOST = 4;
改为
static const int NUMOFGHOST = 4;
就顺利编译通过了。这里的static是用来把定义的const常量标记为对外不可见的。
这里顺便抱怨一句:这xcode也太不人性化了,重复定义就说重复定义嘛,非要用红红的字标出来"Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1",反倒是很重要的那句"ld: duplicate symbol _NUMOFGHOST in /Users/asfgasiyf/Desktop/pacMan/build/pacMan.build/Debug-iphonesimulator/pacMan.build/Objects-normal/i386/MazeView.o and /Users/asfgasiyf/Desktop/pacMan/build/pacMan.build/Debug-iphonesimulator/pacMan.build/Objects-normal/i386/pacManAppDelegate.o"用灰灰的颜色显示,也不懂得突出一下重点⋯⋯
- Objective-C中const常量是外连接的
- Objective-C中const常量是外连接的
- C中const 定义常量的使用
- C/C++中define定义的常量与const常量
- objective-c 字符串是怎么连接的
- 关于Objective-C的常量
- Objective-C 常量的设置
- C语言中const只读变量及常量的注意事项
- C语言中,常量=const?
- 深入理解Objective-C中字符串常量
- C语言中const char* 和char* const等常量的正确理解
- C++ 常量折叠和C语言中const常量对比
- const是声明常量的,dim是声明变量的
- C语言中变量的地址是一个常量
- Objective-C - 类的静态常量
- c 常量 const
- C++const/常量折叠
- Objective-C中的常量定义方法、C中static 对全局变量extern的限制
- YUV / RGB 格式及快速转换算法
- 纷飞
- native2ascii
- Extjs中图片显示混乱的解决方法
- 写给未来的信
- Objective-C中const常量是外连接的
- 用Visual C++设计窗体探测器
- JSmooth的使用:JAR包弄成EXE
- 如何:为泛型列表创建迭代器块(C# 编程指南)
- 早期版本的traps.c
- Understanding Linux Network Internals-1. OverAll
- gnome-terminal用的是配置文件是哪一个?改了default,结果现在无法启动了
- Customer getting the high quality products
- 主题班会:怎样缓解学习压力