Effective C++第一条“尽量以Const和InLine取代#define”在实际工作中并不是那么好用

时间:2022-04-04 05:35:42
看这此书后,感觉讲得十分好,与是想把它的条款尽量用在工作中,如标题,碰到如下问 题:
通常我们把工程中用到的一些宏定义统一放到一个文件中,此后再需要使用这些宏定义的文件中直接包含这个文件既可,但如果我把它全改成常量了话,那么编译器就会抱怨常量多次重复定义,常量在这种情况下就难以发挥作用了,但这也是我们实际工作中宏最常用的方法。所以感觉Scott Meyers提出的这一条是否有欠慎重考虑!

18 个解决方案

#1


const可以定义类型

#2


只在一个文件里定义会有重定义的报错?
你该不会在头文件里没有用#ifndef...#define...#endif吧?

#3


const常量的定义一般放在c或cpp文件中,
头文件放extern声明。这样就不会有问题了。

#4


楼上的说得对,用“extern”关键字就能很不错的解决问题。

#5


使用static声明变量,这样这些变量的访问仅能被限定在该模块中。

#6


刚刚重新翻了一下,(根据C++标准)在头文件中定义const常量并不会导致冲突,在VC6.0上测试通过。

#7


变量只能定义一次,但能声明多次。
在与常量密切相关的c、cpp文件中定义常量变量,然后在头文件中声明extern或者在用到的地方声明extern

#8


楼主你跑的太远了.
基础太差, 建议学完C++以后, 再找一本C语言最基础的书看看. 

在C++中用const表示常量是一种非常好的方法. 可以进行类型检查. 用宏是做不到的.

#9


mark

#10


我在工作中一直都用const代替#define
效果还可以

#11


主要 是 c++ 对类型要求比较 严格

使用 define ,是没有类型的,只做 替换

使用 const ,对 c++ 程序来说 , 明确的告诉系统

一个 变量的 类型

这对 别人 来说 , 看程序, 实现 类型转换 方面

就 很 清晰 明了

#12


再稍微深入一点:
如果确实在不同文件中存在相同的const 常量,该怎么办?
是将它们定义在不同namespace来解决,
还是定义为不同抽象类的静态成员变量?
为甚?

#13


在.h中的都是声明,但并没有给这个变量分配空间。
在.cpp中才是定义,只有这里才分配空间。

例如global.h中可以这么写:
#ifndef _GLOBAL_H_  // 防止重复包含
#define _GLOBAL_H_

extern const int kknd;

#endif

然后在某个cpp文件中定义,如global.cpp中
#include global.h

const int kknd = 10;

#14


请问容易找到有经验的LINUX/C++开发人员吗? 我找来找去还没找到. JAVA倒有不少. 请看以下我的帖子:

http://expert.csdn.net/Expert/topic/1999/1999723.xml?temp=.8192255

#15


>回复人: Joyfish(GoodLuckIsImportant) 
>在.h中的都是声明,但并没有给这个变量分配空间。
>在.cpp中才是定义,只有这里才分配空间。

这两句话相当有问题。

#16


〉回复人: trancebaby(一平) ( ) 信誉:101  2003-07-19 23:21:00  得分:0 
〉〉回复人: Joyfish(GoodLuckIsImportant) 
〉〉在.h中的都是声明,但并没有给这个变量分配空间。
〉〉在.cpp中才是定义,只有这里才分配空间。

〉〉这两句话相当有问题。
  
确实,我的话很不严谨。C++里面并没有规定文件后缀的有何特殊意思。
我的意思是说最好只在.h中申明,然后在某个具体的cpp中定义(实现),
当然这里不考虑模板或内联的情况。

#17


c++中就使用const,它还认得类型呢

#18


还是看看高手门的解释吧,不要轻易怀疑大师说的,别说是Scott Meyers , 就是CSDN里的朋友门水平都很高,自己不懂的多问多学,不要轻易怀疑大师。
可以看看stdio.h这样的头文件,看看是怎么解决重复定义的吧!

#1


const可以定义类型

#2


只在一个文件里定义会有重定义的报错?
你该不会在头文件里没有用#ifndef...#define...#endif吧?

#3


const常量的定义一般放在c或cpp文件中,
头文件放extern声明。这样就不会有问题了。

#4


楼上的说得对,用“extern”关键字就能很不错的解决问题。

#5


使用static声明变量,这样这些变量的访问仅能被限定在该模块中。

#6


刚刚重新翻了一下,(根据C++标准)在头文件中定义const常量并不会导致冲突,在VC6.0上测试通过。

#7


变量只能定义一次,但能声明多次。
在与常量密切相关的c、cpp文件中定义常量变量,然后在头文件中声明extern或者在用到的地方声明extern

#8


楼主你跑的太远了.
基础太差, 建议学完C++以后, 再找一本C语言最基础的书看看. 

在C++中用const表示常量是一种非常好的方法. 可以进行类型检查. 用宏是做不到的.

#9


mark

#10


我在工作中一直都用const代替#define
效果还可以

#11


主要 是 c++ 对类型要求比较 严格

使用 define ,是没有类型的,只做 替换

使用 const ,对 c++ 程序来说 , 明确的告诉系统

一个 变量的 类型

这对 别人 来说 , 看程序, 实现 类型转换 方面

就 很 清晰 明了

#12


再稍微深入一点:
如果确实在不同文件中存在相同的const 常量,该怎么办?
是将它们定义在不同namespace来解决,
还是定义为不同抽象类的静态成员变量?
为甚?

#13


在.h中的都是声明,但并没有给这个变量分配空间。
在.cpp中才是定义,只有这里才分配空间。

例如global.h中可以这么写:
#ifndef _GLOBAL_H_  // 防止重复包含
#define _GLOBAL_H_

extern const int kknd;

#endif

然后在某个cpp文件中定义,如global.cpp中
#include global.h

const int kknd = 10;

#14


请问容易找到有经验的LINUX/C++开发人员吗? 我找来找去还没找到. JAVA倒有不少. 请看以下我的帖子:

http://expert.csdn.net/Expert/topic/1999/1999723.xml?temp=.8192255

#15


>回复人: Joyfish(GoodLuckIsImportant) 
>在.h中的都是声明,但并没有给这个变量分配空间。
>在.cpp中才是定义,只有这里才分配空间。

这两句话相当有问题。

#16


〉回复人: trancebaby(一平) ( ) 信誉:101  2003-07-19 23:21:00  得分:0 
〉〉回复人: Joyfish(GoodLuckIsImportant) 
〉〉在.h中的都是声明,但并没有给这个变量分配空间。
〉〉在.cpp中才是定义,只有这里才分配空间。

〉〉这两句话相当有问题。
  
确实,我的话很不严谨。C++里面并没有规定文件后缀的有何特殊意思。
我的意思是说最好只在.h中申明,然后在某个具体的cpp中定义(实现),
当然这里不考虑模板或内联的情况。

#17


c++中就使用const,它还认得类型呢

#18


还是看看高手门的解释吧,不要轻易怀疑大师说的,别说是Scott Meyers , 就是CSDN里的朋友门水平都很高,自己不懂的多问多学,不要轻易怀疑大师。
可以看看stdio.h这样的头文件,看看是怎么解决重复定义的吧!