Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++11_Language Lawyer_C++14_C - Fatal编程技术网

C++ 引用保留名称是否绝对非法?

C++ 引用保留名称是否绝对非法?,c++,c++11,language-lawyer,c++14,c,C++,C++11,Language Lawyer,C++14,C,std建议书列表中给出了以下代码: #include <vector> #include <algorithm> void foo(const std::vector<int> &v) { #ifndef _ALGORITHM std::for_each(v.begin(), v.end(), [](int i){std::cout << i; } #endif } 我从来没有听到过关于这个的抱怨 那么,你认为呢?“不得以其他方式使

std建议书列表中给出了以下代码:

#include <vector>
#include <algorithm>

void foo(const std::vector<int> &v) {
#ifndef _ALGORITHM
  std::for_each(v.begin(), v.end(), [](int i){std::cout << i; }
#endif
}
我从来没有听到过关于这个的抱怨


那么,你认为呢?“不得以其他方式使用”是否包括简单地写下这样一个名字?或者它可能不打算如此严格(这可能意味着有机会调整标准措辞)?

它是否合法取决于具体实施(和特定标识符)

当标准赋予实现使用这些名称的唯一权利时,包括在用户代码中提供这些名称的权利。如果一个实现做到了这一点,那就太好了


但是,如果一个实现没有明确地给予您权利,那么从“不得以其他方式使用”中可以清楚地看出,该标准没有,并且您有未定义的行为。

重要的部分是“保留给实现”。这意味着编译器供应商可以使用这些名称,甚至可以记录它们。然后,您的代码可能会使用文档中记录的名称。这通常用于扩展,如
\uu内置\u expect
,其中编译器供应商通过使用保留名称避免与标识符(由代码声明)发生冲突。甚至标准也将其用于
\uuuuuuu属性
等,以确保在添加新功能时不会破坏现有(合法)代码。

每个包含双底存储的标识符或以下划线开头,后跟大写字母的标识符都保留给实现以供任何使用

任何用途。(应用缺陷修复前后都会出现类似的文本)


\uuu cplusplus
由标准定义<代码>\算法由标准保留,供实现使用。这些看起来很不一样?(标准的两个部分确实存在冲突,一个部分声明
\uuucplusplus
保留供任何使用,另一个部分专门使用,但我认为冲突的赢家是明确的)

根据该标准,
\u算法
标识符可以用作预处理步骤的一部分,即“用硬盘删除代码替换此源代码”。它的存在(在预处理之前或之后)足以完全改变您的程序行为

现在这不太可能,但我认为这不会导致不一致的实现。这只是执行质量的问题


实现可以自由地记录和定义
\u算法
的含义。例如,它可以记录它是
问题的标题保护,而不是问题。我没有深入研究该标准来寻找有关它的引用。

历史上,使用此类标记的目的是“未定义的行为”,编译器可以自由地将他们想要的任何含义附加到任何未在C标准中定义的此类标记上。例如,在某些嵌入式处理器上,使用扩展数据作为变量的存储类将要求将其存储在RAM区域中,该区域的访问速度比普通变量存储区域慢,但要大得多。在该系列的典型处理器上,“普通”变量的存储空间将限制在100字节左右,但扩展数据变量的存储空间可能要大得多——高达64K。该标准基本上没有说明编译器可以对这些指令执行什么操作,尽管通常(我不确定该标准是否强制执行此行为,尽管我不知道编译器是否违反了该行为)在使用
#if
或类似指令禁用的代码中,这些标记通常会被忽略

某些库的头文件将使用以两个下划线开头但包含编译器不太可能用于任何目的的模式(例如,Foozle库的23版可能在其标识符之前使用use
\uuuu FZ23
)。对于未来的编译器来说,出于其他目的使用以_FZ23开头的标识符是完全合法的,如果发生这种情况,Foozle库将需要更改为使用其他东西。但是,如果主要的编译器升级可能出于其他原因需要重写Foozle库,那么与标识符与外部代码冲突的风险相比,该风险是可以接受的

还请注意,某些项目头文件针对需要
\uuu
指令的处理器,在为其他处理器编译时,可能会有条件地使用这些名称定义宏,例如:

#ifndef USE_XDATA
#define __XDATA
#endif
虽然更好的模式通常是:

#ifdef USE_XDATA
#define XDATA __XDATA
#else
#define XDATA
#endif

编写新代码时,后一种模式通常更好,但在修改在需要扩展数据的平台上编写的现有代码时,前一种模式有时可能有用,以便在使用/需要该指令的平台和不使用该指令的平台上都可以使用。

它是否合法取决于当地法律。它是否意味着什么,如果是,意味着什么,这是语言定义的问题。当您使用为实现保留的名称时,程序的行为是未定义的。这意味着语言定义不会告诉您程序的功能。不多不少。如果您使用的编译器记录了特定保留标识符的功能,那么您可以将该标识符与该编译器一起使用。如果您搜索标题并猜测各种未记录的标识符意味着什么,您可能可以使用它们,但如果后续更新更改某些内容时代码中断,请不要感到惊讶


不要挂断
\uu cplusplus
。它是核心语言,关于双下划线等的东西是库。如果这不能令人信服,那就把它看作是一个小故障。在C++程序中可以使用<代码>它的含义很明确。

在[cpp.prefined]中的名称是不同的。那些哈
#ifdef USE_XDATA
#define XDATA __XDATA
#else
#define XDATA
#endif