常量字符串定义还是使用宏?

Inhibitory 2013-03-31 10:58:16
有一个问题突然搞不清了:
例如有一个字符串:"Start Event"
书上会推荐我们定义成
const char *EVENT_START = "Start Event";

而不推荐使用宏:
#define EVENT_START "Start Event"


但是如果是在这个大工程中,有非常多这样的字符串,手边的工程就有需要上万个这样的常量字符串,那么如果使用const char *来定义在某个文件中(这个文件就是专门放这些常量字符串的),这样会一开始就会占用很多不必要的内存,如果用宏#define的话,就不会占用内存了,只有在需要的时候才占用。

是一如即往的使用宏来定义这样的字符串呢还是分情况,如果只是些小工程就用const char *,真需要太多的时候就用宏?
...全文
692 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
liufuguansheng 2013-04-02
  • 打赏
  • 举报
回复
哈哈,混乱代码加密,不让别人容易看明白就常用宏定义!各有所长啦
路口转弯 2013-04-01
  • 打赏
  • 举报
回复
在c++中如果要用宏来定义的话,很容易出现一些意想不到的错误,而且要是多次用的话(上千个),就会很占内存,而要是用const char*他就只是占用一个地址空间,还是很省空间的,所以我建议你还是一如既往的用const char*比较好,不知道我的回复你满意不?
Orc___love 2013-04-01
  • 打赏
  • 举报
回复
只知道宏是一个替换,会不安全。。。水一下,混脸熟。。。
h_w_m 2013-04-01
  • 打赏
  • 举报
回复
何必纠结呢: 头文件做活一点,想和哪个都随意,默认的会是节省内存模式的,用到的点内存,不用到的不占内存 想使用const常量方式就定义一下宏USE_CONST_MODE,管它用到不用到都每个定义的常量都会占用空间

#ifndef USE_CONST_MODE
#define EVENT_START "Start Event"
......
#else
const char *EVENT_START = "Start Event";
......
#endif
ForestDB 2013-04-01
  • 打赏
  • 举报
回复
假设有1W个字符串,每个有100个char,那么也才1M的空间,这点也承受不起?
shen_wei 2013-04-01
  • 打赏
  • 举报
回复
各有各的用处。。如果不是多次使用的字符串还是const 这样更安全!!
赵4老师 2013-04-01
  • 打赏
  • 举报
回复
尺有所短,寸有所长。
  • 打赏
  • 举报
回复
编译器会合并同样的常量字符串,lz的2种写法,最后编译出来的结果应该是没啥区别的。
Inhibitory 2013-03-31
  • 打赏
  • 举报
回复
引用 8 楼 supermegaboy 的回复:
不过,像楼主那样用类对象宏的话,恐怕要写成千上万条#define,完全可以改为类函数宏嘛,例如: #define STRING( x ) #x
使用成千上万的#define也是被逼无奈,当这些字符串常量很多的时候,如果用类函数宏,很容易出问题,不易于查找错误原因,尤其是数量级越来越大的时候。
飞天御剑流 2013-03-31
  • 打赏
  • 举报
回复
楼主的想法是有一定道理的,在这个问题上,对于楼主的需求(节约空间),用宏比定义一大堆字符串字面量要好,不需要墨守成规,书中的建议并不是任何情况下都适合的。 不过,像楼主那样用类对象宏的话,恐怕要写成千上万条#define,完全可以改为类函数宏嘛,例如: #define STRING( x ) #x 这样宏就仅需要写一条得了。缺点是,失去了对实例的约束,客户想怎么写就怎么写,楼主需要这种约束么?可以权衡一下。 对于楼主4楼的问题,答案是实现相关,对于同一个字符串字面量,编译器可以产生同一实例,也可以产生不同的实例,一般来说,编译器会提供编译器选项让客户自行选择。
mujiok2003 2013-03-31
  • 打赏
  • 举报
回复

const char *EVENT_START = "Start Event";
//占用的内存有俩个部分: EVENT_START和"Start Event"
//对于"Start Event"和宏定义没有区别
//变量EVENT_START, 如果从来没有引用/使用过,一般会被优化掉,不用担心
//使用宏的缺点是没有类型,不够安全,容易出错。
FancyMouse 2013-03-31
  • 打赏
  • 举报
回复
>这两个常量字符串分别占用各自的空间而不是共享一个"Hello"吗? 编译器够傻的话才不共享。
Inhibitory 2013-03-31
  • 打赏
  • 举报
回复
引用 3 楼 turingo 的回复:
const char *EVENT_START = "Start Event"; 这种方式所强调的是: 1、"Start Event”尽可能的被看作是字符串资源; 2、"Start Event”尽可能的只存储一个拷贝; 3、"Start Event”通常不会被随意修改。
这个存放常量字符串的文件有两个作用,对每个字符串都有一个整数的标志,而这些字符串同时还要作为资源被编译进可执行文件,不只是简单的作为一个字符串来使用。因为程序中很多地方都是用字符串对应的整数标志去读取这个字符串。
Inhibitory 2013-03-31
  • 打赏
  • 举报
回复
引用 1 楼 Mackz 的回复:
如果是宏,才会在所有用到的地方复制一份,占内存
宏只是展开成一个常量字符串,如下 func1("Hello"); func2("Hello"); 这两个常量字符串分别占用各自的空间而不是共享一个"Hello"吗?
图灵狗 2013-03-31
  • 打赏
  • 举报
回复
const char *EVENT_START = "Start Event"; 这种方式所强调的是: 1、"Start Event”尽可能的被看作是字符串资源; 2、"Start Event”尽可能的只存储一个拷贝; 3、"Start Event”通常不会被随意修改。
菜牛 2013-03-31
  • 打赏
  • 举报
回复
如果说是一个公用定义字符串的地方,有些工程用部分,有些工程用另一部份,这个在链接的时候是会由于常量的定义导致空间浪费。不过这是你们方法错了,大量的字符串,完全可以用配置文件,而不是放在程序里面,也方便管理、修改。
菜牛 2013-03-31
  • 打赏
  • 举报
回复
你的概念完全错了。如果是宏,才会在所有用到的地方复制一份,占内存;如果是常量,用到的地方只是一个地址,存放的只有一份内容。 另外宏不具有类型安全性,容易造成代码错误,有时候还不好检查出来,所以推荐常量就用const定义。 话说人家一个语言专门推一个const关键字不会没用。
AnYidan 2013-03-31
  • 打赏
  • 举报
回复
c++ 一般会推荐 const char * 而不是宏,因为宏不支持 安全性检查,但我想推荐者可能并非针对 lz 工程的特例,设计就是一种平衡、折中、妥协
www_adintr_com 2013-03-31
  • 打赏
  • 举报
回复
字符串所占用的内存宏和常量定义并没有什么区别, 链接的时候相同的字符串常量只会在编译后的文件中存在一份. 使用常量时, 保存常量字符串的指针变量通常来说是可以优化掉的, 也不会占用空间. 如果确实没优化掉的话, 就不仅是多占用了 4 个字节空间, 而且访问也会慢一点了.
佑勿勿 2013-03-31
  • 打赏
  • 举报
回复
宏这种东西在C++中并不提倡用,很多缺点,而它的优点完全可由inline以及const来替代。 至于楼主说的内存浪费问题,这个还得看编译器。如果编译器知道了某个const的所有使用,甚至可以不为该const分配空间。(C++程序设计语言---86页)
加载更多回复(1)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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