把这个代码:有多大?C标准库扩展影响C++程序?
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)
与任一
is
或to
,和一个小写字母可被添加到的声明在<ctype.h>
开始函数名头。
C99,7.1.3(或C11,7.1.3)
每个头声明或定义在其相关联的子条款中列出的所有的标识符,并且任选地声明或定义中列出的标识符在其相关联的未来图书馆方向款,以及它们总是保留要么用于任何用途或用作文件范围标识符的标识符。
[...]
- 以任何以下小节(包括未来图书馆方向)的外部链接的所有标识符总是保留用作具有外部链接标识符。
[...]如果程序声明或定义在上下文中(由7.1.4所允许比其他)的标识符,其中它被保留,或者保留的标识符定义为宏名称,行为是不确定的。
基于上述,我认为函数名issuecode
实际上是保留用于<ctype.h>
,所以程序在技术上有UB。
问题0(完整性检查):我读的标准是否正确,程序的行为在技术上未定义?
问题1:将程序有UB如果编译为C++代码?
我相信答案是“不”,从下面的引用中,我会说C的“未来库方向”不是C++标准库的一部分,但我不确定。
C++ 11,21。7
表74,75,76,77,78,和79分别描述了标题
<cctype>
,<cwctype>
,<cstring>
,<cwchar>
,<cstdlib>
(字符转换),和<cuchar>
。这些标头的内容应是相同的,分别作为标准C库头
<ctype.h>
,<wctype.h>
,<string.h>
,<wchar.h>
,和<stdlib.h>
且C的Unicode TR头,并作以下修改:
“以下修改”都没有提到附加的保留标识符。表74是诸如isdigit
和isalnum
之类的函数名称的列表。
C++ 11,C.2
1.本节概括了C++从标准C库包括标准库的内容。它还概述了其他小节(17.6.1.2,18.2,21.7)中标注的标准C库中定义,声明或行为的明确变化。
7. C++标准库C库中提供209层标准的功能,如表153
同样,表153是一个taxative列表。
问题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),这是用于各个语言的最新公开可用的草稿所采取版本。
0.校验和匹配。 1.我认为是,C++标准库**包含所有C标准库(甚至是旧的,不推荐使用的.h头文件)作为子集**。 2.我再次认为是,因为你现在不在'std ::'命名空间中。 (尽管如此,最好的方法是在DS9K上进行测试。) – 2013-07-06 15:58:26
+1,但是......认真吗?包含名称以“is”开头的函数的C++程序具有UB?如果是这样,我一直在写UB ...... –
@AndyProwl那些是我读完C标准部分时的想法。这就是为什么我反问这个问题的原因。从技术上讲,它只是非静态的全局函数;所有更多的理由使用命名空间;-) – Angew