为什么一般的C++教材不介绍宏和联合体?

时间:2022-09-05 17:03:35
虽然好像不是很符合C++的风格,但是毕竟是合法的呀。怎么基本上看不到C++教材对它们的介绍呢?

29 个解决方案

#1


宏没有类型检查,据说c家家都是用const来替代宏。

#2


引用 1 楼 u014444402 的回复:
宏没有类型检查,据说c家家都是用const来替代宏。

宏除了定义常量以外还有很多有用而强大的功能吧,比如说

#define SAFE_DELETE {if(x) delete x; x = NULL;}

就是一个很有用的宏。

#3


引用 2楼我是你的主体 的回复:
Quote: 引用 1 楼 u014444402 的回复:

宏没有类型检查,据说c家家都是用const来替代宏。

宏除了定义常量以外还有很多有用而强大的功能吧,比如说

#define SAFE_DELETE {if(x) delete x; x = NULL;}

就是一个很有用的宏。
这种是不是直接inline可以取代了?

#4


引用 3 楼 u014444402 的回复:
这种是不是直接inline可以取代了?

刚才写错了,是

#define SAFE_DELETE(x) {if(x) delete x; x = NULL;}

才对。这个没法改写成函数的。

#5


宏被const替代掉了
联合体不咋用的到了,因为现在的程序都不缺内存(内存不值钱了)

#6


 C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1)   const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2)   有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
联合体的缺点就是优点不够突出 为什么一般的C++教材不介绍宏和联合体?

#7


引用 6 楼 qq423399099 的回复:
 C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1)   const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2)   有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
联合体的缺点就是优点不够突出 为什么一般的C++教材不介绍宏和联合体?

然而我说的是宏,并不是定义常量呀。

#8


在C++ 里,内联函数更削减了函数宏的用武之地,在J a v a里根本就没有宏这种东西。即使是在C语言里,它们带来的麻烦也比解决的问题更多。函数宏最常见的一个严重问题是:如果一个参数在定义中出现多次,它就可能被多次求值。如果调用时的实际参数带有副作用,结果就会产生一个难以捉摸的错误。

#9


c++中尽量少用宏
除了用于编译开关的宏定义之外及## #连接等特殊用途之外
其他宏的功能都有更好的替代方式
比如const常量
比如inline函数
比如更强大的模板函数,模板类

#10


引用 4 楼 u011873969 的回复:
Quote: 引用 3 楼 u014444402 的回复:

这种是不是直接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 只是个劣等的替代品而已

#15


因为一般的C++教材假设你有C语言的基础?

#16


因为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的一种。

#22


引用 19 楼 zhao4zhong1 的回复:
宏不属于C++,联合体也不属于C++。

误导肛一次。

#23


引用 14 楼 D41D8CD98F 的回复:
另外“用 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


看评论,涨知识 为什么一般的C++教材不介绍宏和联合体?

#28


引用 2 楼 u011873969 的回复:
Quote: 引用 1 楼 u014444402 的回复:

宏没有类型检查,据说c家家都是用const来替代宏。

宏除了定义常量以外还有很多有用而强大的功能吧,比如说

#define SAFE_DELETE {if(x) delete x; x = NULL;}

就是一个很有用的宏。

这个宏显然有点啰嗦,c++标准规定了delete x时,如果x == NULL,是没有任何副作用的

#29


那都是c的技术,c++主要是类、对象,当然包容了c的语法

#1


宏没有类型检查,据说c家家都是用const来替代宏。

#2


引用 1 楼 u014444402 的回复:
宏没有类型检查,据说c家家都是用const来替代宏。

宏除了定义常量以外还有很多有用而强大的功能吧,比如说

#define SAFE_DELETE {if(x) delete x; x = NULL;}

就是一个很有用的宏。

#3


引用 2楼我是你的主体 的回复:
Quote: 引用 1 楼 u014444402 的回复:

宏没有类型检查,据说c家家都是用const来替代宏。

宏除了定义常量以外还有很多有用而强大的功能吧,比如说

#define SAFE_DELETE {if(x) delete x; x = NULL;}

就是一个很有用的宏。
这种是不是直接inline可以取代了?

#4


引用 3 楼 u014444402 的回复:
这种是不是直接inline可以取代了?

刚才写错了,是

#define SAFE_DELETE(x) {if(x) delete x; x = NULL;}

才对。这个没法改写成函数的。

#5


宏被const替代掉了
联合体不咋用的到了,因为现在的程序都不缺内存(内存不值钱了)

#6


 C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1)   const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2)   有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
联合体的缺点就是优点不够突出 为什么一般的C++教材不介绍宏和联合体?

#7


引用 6 楼 qq423399099 的回复:
 C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1)   const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2)   有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
联合体的缺点就是优点不够突出 为什么一般的C++教材不介绍宏和联合体?

然而我说的是宏,并不是定义常量呀。

#8


在C++ 里,内联函数更削减了函数宏的用武之地,在J a v a里根本就没有宏这种东西。即使是在C语言里,它们带来的麻烦也比解决的问题更多。函数宏最常见的一个严重问题是:如果一个参数在定义中出现多次,它就可能被多次求值。如果调用时的实际参数带有副作用,结果就会产生一个难以捉摸的错误。

#9


c++中尽量少用宏
除了用于编译开关的宏定义之外及## #连接等特殊用途之外
其他宏的功能都有更好的替代方式
比如const常量
比如inline函数
比如更强大的模板函数,模板类

#10


引用 4 楼 u011873969 的回复:
Quote: 引用 3 楼 u014444402 的回复:

这种是不是直接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 只是个劣等的替代品而已

#15


因为一般的C++教材假设你有C语言的基础?

#16


因为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的一种。

#22


引用 19 楼 zhao4zhong1 的回复:
宏不属于C++,联合体也不属于C++。

误导肛一次。

#23


引用 14 楼 D41D8CD98F 的回复:
另外“用 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


看评论,涨知识 为什么一般的C++教材不介绍宏和联合体?

#28


引用 2 楼 u011873969 的回复:
Quote: 引用 1 楼 u014444402 的回复:

宏没有类型检查,据说c家家都是用const来替代宏。

宏除了定义常量以外还有很多有用而强大的功能吧,比如说

#define SAFE_DELETE {if(x) delete x; x = NULL;}

就是一个很有用的宏。

这个宏显然有点啰嗦,c++标准规定了delete x时,如果x == NULL,是没有任何副作用的

#29


那都是c的技术,c++主要是类、对象,当然包容了c的语法