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)
- 以下任何子条款(包括未来库方向)中具有外部链接的所有标识符始终保留用作具有外部链接的标识符
issuecode
实际上是保留在
中使用的,因此该程序在技术上具有UB
问题0(健全性检查):我对标准的解读是否正确,程序的行为是否在技术上未定义
<强>问题1:程序是否有UB编译为C++代码?< /P> 我相信答案是“不”,从下面的引文中,我可以说C的“未来图书馆方向”不是C++标准库的一部分,但我不太确定。 C++11,21.7
、
、
、
、
(字符转换)和
、
、
、
和
以及C Unicode TR标题相同,但需进行以下修改: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标准的那部分时,这些正是我的想法。这就是我问这个问题的原因。一