29 个解决方案
#1
宏没有类型检查,据说c家家都是用const来替代宏。
#2
宏除了定义常量以外还有很多有用而强大的功能吧,比如说
#define SAFE_DELETE {if(x) delete x; x = NULL;}
就是一个很有用的宏。
#3
这种是不是直接inline可以取代了?
#4
这种是不是直接inline可以取代了?
刚才写错了,是
#define SAFE_DELETE(x) {if(x) delete x; x = NULL;}
才对。这个没法改写成函数的。
#5
宏被const替代掉了
联合体不咋用的到了,因为现在的程序都不缺内存(内存不值钱了)
联合体不咋用的到了,因为现在的程序都不缺内存(内存不值钱了)
#6
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
联合体的缺点就是优点不够突出
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
联合体的缺点就是优点不够突出
#7
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
联合体的缺点就是优点不够突出
然而我说的是宏,并不是定义常量呀。
#8
在C++ 里,内联函数更削减了函数宏的用武之地,在J a v a里根本就没有宏这种东西。即使是在C语言里,它们带来的麻烦也比解决的问题更多。函数宏最常见的一个严重问题是:如果一个参数在定义中出现多次,它就可能被多次求值。如果调用时的实际参数带有副作用,结果就会产生一个难以捉摸的错误。
#9
c++中尽量少用宏
除了用于编译开关的宏定义之外及## #连接等特殊用途之外
其他宏的功能都有更好的替代方式
比如const常量
比如inline函数
比如更强大的模板函数,模板类
除了用于编译开关的宏定义之外及## #连接等特殊用途之外
其他宏的功能都有更好的替代方式
比如const常量
比如inline函数
比如更强大的模板函数,模板类
#10
这种是不是直接inline可以取代了?
刚才写错了,是
#define SAFE_DELETE(x) {if(x) delete x; x = NULL;}
才对。这个没法改写成函数的。
你可以这样写啊
template <typename T>
inline void SAFE_DELETE( T &x )
{
if( x )
{
delete x;
}
x = NULL;
}
#11
梅大师说,尽可能用const来代替#define
#12
有了const和内敛函数,几乎体现不出宏的用武之地。。。
#13
为什么一般的C++教材要介绍宏和联合体?
#14
另外“用 const 代替宏”放在六年前可以这么说。现在看来, C++ 为了支持这种说法而强行给了 const 特殊的规则,不仅仅是造成规则的不和谐,而且最终也是没能代替(具体来说,#define NEXT(x) ((x)+1) 这么简单的宏,只用 const 根本无法做到—— inline 欠缺在无法用在模板参数之类的常量表达式)。
结果是 C++11 增加了 constexpr 变量 / 函数。它代替了 const 的功能,就使得原本规则的不和谐更加明显了
struct C {
static T v = 0; // 如果 T 是 const non-volatile integral type(例如 const int),这就是合法的,否则(例如 T 是 int、const volatile int 或 const float)这就是不合法的
};
结论是,与 constexpr 相比, const 只是个劣等的替代品而已
结果是 C++11 增加了 constexpr 变量 / 函数。它代替了 const 的功能,就使得原本规则的不和谐更加明显了
struct C {
static T v = 0; // 如果 T 是 const non-volatile integral type(例如 const int),这就是合法的,否则(例如 T 是 int、const volatile int 或 const float)这就是不合法的
};
结论是,与 constexpr 相比, const 只是个劣等的替代品而已
#15
因为一般的C++教材假设你有C语言的基础?
#16
因为C++是C的超集
C++中C 部分,一般不会介绍的,除非和C有所不同
C++中C 部分,一般不会介绍的,除非和C有所不同
#17
c++教材当然会介绍联合体了,但是宏却不经常讲,因为c++不推荐用宏,而是建议用内联函数代替宏函数,而用const代替宏变量
不过实际使用的时候为了完成某些特殊的目的,还是不得不考虑使用宏的方式,最典型的是风格修正,代码生成宏,不过代码生成宏有时候也可以用模板来实现
不过实际使用的时候为了完成某些特殊的目的,还是不得不考虑使用宏的方式,最典型的是风格修正,代码生成宏,不过代码生成宏有时候也可以用模板来实现
#18
c++的宏基本上是用来条件编译用的,其他的宏功能c++都有更好的替代方案
#19
宏不属于C++,联合体也不属于C++。
#20
这俩在 c++ 里面用处都不是很大,另外 c++ 东西太多,都写了篇幅太大,只能捡重要的说。
#21
因为你用的书太烂。
就算强调尽量不用,也需要明白一些常识,比如public header要用macro当guard而不是什么#pragma once的私货,比如union是class type的一种。
就算强调尽量不用,也需要明白一些常识,比如public header要用macro当guard而不是什么#pragma once的私货,比如union是class type的一种。
#22
宏不属于C++,联合体也不属于C++。
误导肛一次。
#23
另外“用 const 代替宏”放在六年前可以这么说。现在看来, C++ 为了支持这种说法而强行给了 const 特殊的规则,不仅仅是造成规则的不和谐,而且最终也是没能代替(具体来说,#define NEXT(x) ((x)+1) 这么简单的宏,只用 const 根本无法做到—— inline 欠缺在无法用在模板参数之类的常量表达式)。
结果是 C++11 增加了 constexpr 变量 / 函数。它代替了 const 的功能,就使得原本规则的不和谐更加明显了
struct C {
static T v = 0; // 如果 T 是 const non-volatile integral type(例如 const int),这就是合法的,否则(例如 T 是 int、const volatile int 或 const float)这就是不合法的
};
结论是,与 constexpr 相比, const 只是个劣等的替代品而已
所谓的支持彻头彻尾是假象。宏替换比常量表达式的求值显然在更早的翻译阶段运行,所以实际上就算再简单的类型也替代不了。比如说#if检查byte order,用const?……笑话。
相比constexpr来讲const当然仍然有用,因为const是qualifier而constexpr不是。虽然也是鸡肋(map key_type呵呵呵……)还污染ABI,总算能propogate,比gayva之流挨个儿final好点。
#24
模拟一些C++中还没有的功能(如“能用的RTTI”)离不开宏。
#25
不提倡而已,
#26
RTTI也可以不用宏来实现的。
#27
看评论,涨知识
#28
宏没有类型检查,据说c家家都是用const来替代宏。
宏除了定义常量以外还有很多有用而强大的功能吧,比如说
#define SAFE_DELETE {if(x) delete x; x = NULL;}
就是一个很有用的宏。
这个宏显然有点啰嗦,c++标准规定了delete x时,如果x == NULL,是没有任何副作用的
#29
那都是c的技术,c++主要是类、对象,当然包容了c的语法
#1
宏没有类型检查,据说c家家都是用const来替代宏。
#2
宏没有类型检查,据说c家家都是用const来替代宏。
宏除了定义常量以外还有很多有用而强大的功能吧,比如说
#define SAFE_DELETE {if(x) delete x; x = NULL;}
就是一个很有用的宏。
#3
宏没有类型检查,据说c家家都是用const来替代宏。
宏除了定义常量以外还有很多有用而强大的功能吧,比如说
#define SAFE_DELETE {if(x) delete x; x = NULL;}
就是一个很有用的宏。
#4
这种是不是直接inline可以取代了?
刚才写错了,是
#define SAFE_DELETE(x) {if(x) delete x; x = NULL;}
才对。这个没法改写成函数的。
#5
宏被const替代掉了
联合体不咋用的到了,因为现在的程序都不缺内存(内存不值钱了)
联合体不咋用的到了,因为现在的程序都不缺内存(内存不值钱了)
#6
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
联合体的缺点就是优点不够突出
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
联合体的缺点就是优点不够突出
#7
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
联合体的缺点就是优点不够突出
然而我说的是宏,并不是定义常量呀。
#8
在C++ 里,内联函数更削减了函数宏的用武之地,在J a v a里根本就没有宏这种东西。即使是在C语言里,它们带来的麻烦也比解决的问题更多。函数宏最常见的一个严重问题是:如果一个参数在定义中出现多次,它就可能被多次求值。如果调用时的实际参数带有副作用,结果就会产生一个难以捉摸的错误。
#9
c++中尽量少用宏
除了用于编译开关的宏定义之外及## #连接等特殊用途之外
其他宏的功能都有更好的替代方式
比如const常量
比如inline函数
比如更强大的模板函数,模板类
除了用于编译开关的宏定义之外及## #连接等特殊用途之外
其他宏的功能都有更好的替代方式
比如const常量
比如inline函数
比如更强大的模板函数,模板类
#10
这种是不是直接inline可以取代了?
刚才写错了,是
#define SAFE_DELETE(x) {if(x) delete x; x = NULL;}
才对。这个没法改写成函数的。
你可以这样写啊
template <typename T>
inline void SAFE_DELETE( T &x )
{
if( x )
{
delete x;
}
x = NULL;
}
#11
梅大师说,尽可能用const来代替#define
#12
有了const和内敛函数,几乎体现不出宏的用武之地。。。
#13
为什么一般的C++教材要介绍宏和联合体?
#14
另外“用 const 代替宏”放在六年前可以这么说。现在看来, C++ 为了支持这种说法而强行给了 const 特殊的规则,不仅仅是造成规则的不和谐,而且最终也是没能代替(具体来说,#define NEXT(x) ((x)+1) 这么简单的宏,只用 const 根本无法做到—— inline 欠缺在无法用在模板参数之类的常量表达式)。
结果是 C++11 增加了 constexpr 变量 / 函数。它代替了 const 的功能,就使得原本规则的不和谐更加明显了
struct C {
static T v = 0; // 如果 T 是 const non-volatile integral type(例如 const int),这就是合法的,否则(例如 T 是 int、const volatile int 或 const float)这就是不合法的
};
结论是,与 constexpr 相比, const 只是个劣等的替代品而已
结果是 C++11 增加了 constexpr 变量 / 函数。它代替了 const 的功能,就使得原本规则的不和谐更加明显了
struct C {
static T v = 0; // 如果 T 是 const non-volatile integral type(例如 const int),这就是合法的,否则(例如 T 是 int、const volatile int 或 const float)这就是不合法的
};
结论是,与 constexpr 相比, const 只是个劣等的替代品而已
#15
因为一般的C++教材假设你有C语言的基础?
#16
因为C++是C的超集
C++中C 部分,一般不会介绍的,除非和C有所不同
C++中C 部分,一般不会介绍的,除非和C有所不同
#17
c++教材当然会介绍联合体了,但是宏却不经常讲,因为c++不推荐用宏,而是建议用内联函数代替宏函数,而用const代替宏变量
不过实际使用的时候为了完成某些特殊的目的,还是不得不考虑使用宏的方式,最典型的是风格修正,代码生成宏,不过代码生成宏有时候也可以用模板来实现
不过实际使用的时候为了完成某些特殊的目的,还是不得不考虑使用宏的方式,最典型的是风格修正,代码生成宏,不过代码生成宏有时候也可以用模板来实现
#18
c++的宏基本上是用来条件编译用的,其他的宏功能c++都有更好的替代方案
#19
宏不属于C++,联合体也不属于C++。
#20
这俩在 c++ 里面用处都不是很大,另外 c++ 东西太多,都写了篇幅太大,只能捡重要的说。
#21
因为你用的书太烂。
就算强调尽量不用,也需要明白一些常识,比如public header要用macro当guard而不是什么#pragma once的私货,比如union是class type的一种。
就算强调尽量不用,也需要明白一些常识,比如public header要用macro当guard而不是什么#pragma once的私货,比如union是class type的一种。
#22
宏不属于C++,联合体也不属于C++。
误导肛一次。
#23
另外“用 const 代替宏”放在六年前可以这么说。现在看来, C++ 为了支持这种说法而强行给了 const 特殊的规则,不仅仅是造成规则的不和谐,而且最终也是没能代替(具体来说,#define NEXT(x) ((x)+1) 这么简单的宏,只用 const 根本无法做到—— inline 欠缺在无法用在模板参数之类的常量表达式)。
结果是 C++11 增加了 constexpr 变量 / 函数。它代替了 const 的功能,就使得原本规则的不和谐更加明显了
struct C {
static T v = 0; // 如果 T 是 const non-volatile integral type(例如 const int),这就是合法的,否则(例如 T 是 int、const volatile int 或 const float)这就是不合法的
};
结论是,与 constexpr 相比, const 只是个劣等的替代品而已
所谓的支持彻头彻尾是假象。宏替换比常量表达式的求值显然在更早的翻译阶段运行,所以实际上就算再简单的类型也替代不了。比如说#if检查byte order,用const?……笑话。
相比constexpr来讲const当然仍然有用,因为const是qualifier而constexpr不是。虽然也是鸡肋(map key_type呵呵呵……)还污染ABI,总算能propogate,比gayva之流挨个儿final好点。
#24
模拟一些C++中还没有的功能(如“能用的RTTI”)离不开宏。
#25
不提倡而已,
#26
RTTI也可以不用宏来实现的。
#27
看评论,涨知识
#28
宏没有类型检查,据说c家家都是用const来替代宏。
宏除了定义常量以外还有很多有用而强大的功能吧,比如说
#define SAFE_DELETE {if(x) delete x; x = NULL;}
就是一个很有用的宏。
这个宏显然有点啰嗦,c++标准规定了delete x时,如果x == NULL,是没有任何副作用的
#29
那都是c的技术,c++主要是类、对象,当然包容了c的语法