我知道在的标头中iso646.h
,定义了以下十一个marco常数以提供按位和逻辑运算符的替代描述:
and
是的宏&&
。
and_eq
是的宏&=
。
bitand
是的宏&
。
bitor
是的宏|
。
compl
是的宏~
。
not
是的宏!
。
not_eq
是的宏!=
。
or
是的宏||
。
or_eq
是一个宏 |=
xor
是的宏^
。
xor_eq
是的宏^=
。
但是何时需要使用这些替代宏?
iso646.h
?如果您的编码未实现完整的ASCII曲目,则应使用它:
C从ASCII代码集派生其库。不幸的是,ASCII库不是所有其他常用字符集的子集,并且在欧洲广泛使用的做法也不是全部实现ASCII,而是将其整理序列的某些部分用于特殊的国家字符。
解决方案是国际商定的曲目,可以定义C的国际代表。ISO已定义了这样的标准:ISO 646描述了ASCII的不变子集。
C使用的ASCII库中的字符,而ISO 646库中不存在的字符是:
# [ ] { } \ | ~ ^
正如@chqrlie所指出的那样,这是1980年代要考虑的重要问题,但如今已不那么重要了。
这也是引入三字母组合的原因(在同一部分中有进一步说明)。因此,当使用非ASCII编码时,这些宏将由中的三字母组合形式替换iso646.h
。
我看不到引用的内容与
iso646
?中按位和逻辑运算符的宏之间的关系。三部曲与它有什么关系?在iso646.h
没有三字母组合。您可能还想补充一下,这些考虑是在1980年代初期才出现的,此后甚至在ANSI规范C语言之前就变得无关紧要。今天没有理由使用这些宏或三元组。
@RobertSsupportsMonicaCellio如果您的字符编码没有
~
符号,则必须将其替换为??-
。为了获得更好的可读性,决定提供宏以使代码与更广泛的编码组兼容:compl a
不管~
当前编码中是否存在字符,并且比可读得多,都可以工作??- a
。@RobertSsupportsMonicaCellio字母组合是核心语言的一部分。可以在缺少
#[]{}\
字符的系统上根据标头来实现标头。@RobertSsupportsMonicaCellio通常,您的文本编辑器应该能够告诉您使用哪种编码(并且您应该能够更改文件的文本编码)。从那里开始,您必须查看编码以检查其是否完全支持ASCII(ISO 646 Wikipedia页面列出了很多不支持ASCII的编码)。除非您使用的是非常老的非美国系统或非常特殊的系统,否则几乎没有机会使编码不完全包含ASCII字符集。