Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C标准库扩展性对C++;程序?_C++_C_Language Lawyer_Undefined Behavior_Reserved Words - Fatal编程技术网

C++ C标准库扩展性对C++;程序?

C++ C标准库扩展性对C++;程序?,c++,c,language-lawyer,undefined-behavior,reserved-words,C++,C,Language Lawyer,Undefined Behavior,Reserved Words,以这个代码为例: int issuecode(int i) { return 2 * i; } int main(int argc, char **argv) { return issuecode(argc); } 按照我的理解,如果编译为C程序,它将具有未定义的行为。我的理由基于以下标准引用: C99,7.26(或C11,7.31) 为方便起见,以下名称分组在各个标题下。下面描述的所有外部名称都是保留的,无论程序包含什么标题 C99,7.26.2(或C11,7.31.2) 以开头的

以这个代码为例:

int issuecode(int i)
{
  return 2 * i;
}

int main(int argc, char **argv)
{
  return issuecode(argc);
}
按照我的理解,如果编译为C程序,它将具有未定义的行为。我的理由基于以下标准引用:

C99,7.26(或C11,7.31)

为方便起见,以下名称分组在各个标题下。下面描述的所有外部名称都是保留的,无论程序包含什么标题

C99,7.26.2(或C11,7.31.2)

开头的函数名是
,并且可以在
标题中的声明中添加小写字母

C99,7.1.3(或C11,7.1.3)

  • 每个标头声明或定义其关联子用途中列出的所有标识符,并可选择声明或定义其关联的未来库方向子用途中列出的标识符以及始终保留用于任何用途或用作文件范围标识符的标识符

    [……]

    • 以下任何子条款(包括未来库方向)中具有外部链接的所有标识符始终保留用作具有外部链接的标识符
  • […]如果程序在保留标识符的上下文中声明或定义标识符(7.1.4允许的除外),或将保留标识符定义为宏名称,则该行为未定义

  • 基于上述情况,我认为函数名
    issuecode
    实际上是保留在
    中使用的,因此该程序在技术上具有UB

    问题0(健全性检查):我对标准的解读是否正确,程序的行为是否在技术上未定义

    <强>问题1:程序是否有UB编译为C++代码?< /P> 我相信答案是“不”,从下面的引文中,我可以说C的“未来图书馆方向”不是C++标准库的一部分,但我不太确定。 C++11,21.7

  • 表74、75、76、77、78和79分别描述了标题
    (字符转换)和

  • 这些标题的内容应分别与标准C库标题
    以及C Unicode TR标题相同,但需进行以下修改:

  • “以下修改”均未提及其他保留标识符。表74是函数名的分类列表,如
    isdigit
    isalnum

    C++11,C.2

    一,。该子节概括了标准C库中包含的C++标准库的内容。它还总结了其他子条款(17.6.1.2、18.2、21.7)中提到的标准C库中定义、声明或行为的明确变化

    七,。C++标准库提供了209个标准函数,如表153所示。 同样,表153是一个分类列表

    < P> <强>问题2:< /强>假设我在问题1上出错,程序实际上也在C++中有UB,下面的变化会影响这个吗?
    namespace foo {
    
      int issuecode(int i)
      {
        return 2 * i;
      }
    
    }
    
    using namespace foo;
    
    int main(int argc, char **argv)
    {
      return issuecode(argc);
    }
    

    注:标准引用摘自N1256(C99)、N1570(C11)和N3242(C++11)草案,它们是各自语言版本的最新公开草案

    为方便起见,以下名称分组在各个标题下。下面描述的所有外部名称都是保留的,无论程序包含什么标题

    有一个预定义的保留函数列表,如果您的函数在名称方面没有冲突,则没有问题

    以is或to开头的函数名,可以在头中的声明中添加小写字母

    的操作术语可以添加到
    标题中。“是或到”位只是关于声明组织的指导

    所以那里从来没有不确定的行为

    对于C++,我认为这是遵循同样的思想的:例如:

    namespace foo{
      int isupper ( int c );
    }
    
    #include <cctype>
    using namespace foo;
    int main(void){
        isupper(92);
    }
    
    名称空间foo{
    intisupper(intc);
    }
    #包括
    使用名称空间foo;
    内部主(空){
    isupper(92);
    }
    
    这应该会产生一个编译器错误,因为您的函数在名称方面与C函数冲突,但由于名称空间的原因,这很容易通过在调用的开头添加
    std:
    foo::
    来解决。

    C++11 17.6.1.2头文件

    172)C标准库标题(附录D.5)也定义了全局名称空间中的名称,而C++标题则定义了C 图书馆设施(17.6.1.2)也可以定义全局命名空间中的名称

    但是,在C++标准库中,声明(除了 在C)中定义为宏的名称在名称空间标准的名称空间范围(3.3.6)内 未指定
    这些名称是否首先在全局名称空间范围内声明,然后注入 通过显式使用声明(7.3.3)将其转换为命名空间std


    因此,如果不包括
    ,则行为是定义良好的。如果是,则未指定。

    0。校验和匹配。1.我想是的,C++标准库包含了所有C标准库的子集(甚至是旧的、不推荐的.H报头)。2.我再次认为是的,因为您现在不在
    std::
    名称空间中。(最好是在DS9K上测试。)+1,但是。。。认真地一个C++程序,包含一个函数,其名称从<代码>开始,有UB?如果是这样的话,我一直在写UB…@当我读到C标准的那部分时,这些正是我的想法。这就是我问这个问题的原因。一