C++ C和C+之间的关系是什么+;标准?

C++ C和C+之间的关系是什么+;标准?,c++,c,dependencies,standards,language-lawyer,C++,C,Dependencies,Standards,Language Lawyer,我在写作,我引用了 不可表示为无符号字符且不等于EOF,行为未定义 当我去检查时,我发现作者的评论: 根据C99 7.4/1,不能将负符号字符与任何ctype.h函数一起使用 作者引用C++标准中的C99标准。这有效吗?我在C++标准中找不到任何关于这个函数的定义,所以我必须假设它是有效的。 但这让我担心有两个原因: 我怎么知道C++标准的C标准是什么版本? 这里有一个列表。如果我参照C++来查看C标准,我怎么可能知道我所看到的区域已经被重写了? 关于第一个问题: C++标准明确地列出了C标准

我在写作,我引用了

不可表示为无符号字符且不等于EOF,行为未定义

当我去检查时,我发现作者的评论:

根据C99 7.4/1,不能将负符号字符与任何ctype.h函数一起使用

<>作者引用C++标准中的C99标准。这有效吗?我在C++标准中找不到任何关于这个函数的定义,所以我必须假设它是有效的。 但这让我担心有两个原因:

我怎么知道C++标准的C标准是什么版本?
  • 这里有一个列表。如果我参照C++来查看C标准,我怎么可能知道我所看到的区域已经被重写了?

  • 关于第一个问题:

    C++标准明确地列出了C标准(在标准引用部分中)所依赖的C标准。对于C++14,[intro.refs]1.2/1恰好列出了C 99:

    • ISO/IEC 9899:1999,编程语言-C
    • ISO/IEC 9899:1999/Cor.1:2001(E),编程语言-C,技术勘误1
    • ISO/IEC 9899:1999/Cor.2:2004(E),编程语言-C,技术勘误2
    • ISO/IEC 9899:1999/Cor.3:2007(E),编程语言-C,技术勘误3
    关于第二个问题:

    C++标准没有隐含地包含C标准的任何部分;所有对C标准的引用都是明确的。一个很好的信息来源,关于C++偏离C的信息是附件C,C++标准的“兼容性”,特别是C.1[DIF.ISO]

    另外,对C标准库的引用散布在C++标准库(第17章到第30章中的C++ 14)的描述中。特别令人感兴趣的是:

    • 17.2[library.c],描述了c标准库的基本内容
    • 第18章[语言·支持],它描述了C++标准库中的许多 > /Cult>标头(提供C标准库功能的那些)。
    如何知道C++标准的C标准的版本?< /P> <>在C++ 14中,它是ISO/IEC 9899:1999(加上三个勘误表,所以本质上是C99),如N4140中的1.2 [参考文献]中所述。在C++ 98中,它是C90,在C++ 17中,它可能是C11,但是C++标准总是使它显式。 如果我参照C++来查看C标准,我怎么可能知道我所看到的区域已经被重写了?< /P> 您在C++标准中,它明确地导入C定义减去<代码>限制< /代码>或它想要的任何C行为或做出明显修改。 通常,阅读好的文档而不是标准本身会很好地为您服务


    要回答您最初的问题:

    <>作者引用C++标准中的C99标准。这有效吗

    是的,因为

    一, 表74[包含
    std::tolower
    ,me]、75、76、77、78和79描述了标题
    (字符转换)和

    2. 这些标题的内容应与标准C库标题相同, 分别使用 以下修改[这些修改均不适用于
    std::tolower
    ,me]:


    21.8[c.strings]在N4140中,编辑是正确的,此特定文本自C90以来一直在标准中

    从C904.3开始

    标头声明了几个对测试有用的函数 和映射字符。在所有情况下,参数都是int,而 其值应表示为无符号字符或 等于宏EOF的值。如果这个论点有其他的原因 值,则行为未定义

    从C117.4/1开始

    标头声明了几个用于分类的函数 和映射字符。在所有情况下,参数都是int,而 其值应表示为无符号字符或 等于宏EOF的值。如果参数有任何其他值, 该行为未定义


    同文;C一直都是这样。所以C++的C++版本使用哪个版本并不重要,因为所有的C版本都是等价的。p> FWIW,第一个描述,“不能表示为无符号字符…”是对C99和C11要求的一个非常接近的解释。作者的评论“不能使用否定的未签名字符…”是错误的(更不用说自相矛盾了)。抱歉把事情弄糊涂了;第一次我没有仔细阅读你的问题。哎呀,错误地引用了第二条评论:这是“负签名字符”,而不是“负未签名字符”。尽管如此,“负符号字符”完全是错误的,因为不可表示为符号字符的负值也被禁止,而且允许表示为负符号字符的
    EOF
    。相关的,即使不是重复的:@PeteBecker这是我的提交注释,我指的是\xb4,我改为未签名(同时还添加了UB)。但是,是的,这还不够迂腐。这些都是非常微妙的问题。请问,除非自己是标准委员会的成员,或者至少是一位拥有几千万行成功代码的受人尊敬的作者,否则人们如何区分“阅读好的文档而不是标准本身”?谢谢,@Baum-mitAugen@user3078414我的经验法则是:如果我需要查看标准本身以确定我的代码是否有效,那么它太复杂或太聪明了。我最需要的是我无法控制的东西的标准,比如检查正确性