- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我在 C++ 中使用标准 C 头文件时,我通常更喜欢将标识符放入 std
中的形式。命名空间,例如 <cstdlib>
.然而,当我使用这些时,GCC 也会将名称放入全局命名空间,这意味着它将接受如下程序:
#include <cstddef>
std::size_t x;
size_t y;
int main() {}
在这里,x
的声明是正确的,但是 y
的声明如果我希望我的代码可移植,应该被拒绝。 (请注意,如果我包含 <stddef.h>
而不是 <cstddef>
,GCC 将正确地拒绝 x
的声明)。
我能否让 GCC 拒绝声明 y
以上?
我编译了所有我能想到的迂腐和警告:
-std=c++17 -pedantic -Wall -Wextra -Wpedantic -Weffc++
这些似乎都不能阻止 GCC 接受不可移植的形式。
我现在不确定我是否正确理解规则;我的知识来自 CPP 引用中的这一部分:
C compatibility headers
For some of the C standard library headers of the form
xxx.h
, the C++ standard library both includes an identically-named header and another header of the formcxxx
.With the exception of
complex.h
, eachxxx.h
header included in the C++ standard library places in the global namespace each name that the correspondingcxxx
header would have placed in thestd
namespace.These headers are allowed to also declare the same names in the
std
namespace, and the correspondingcxxx
headers are allowed to also declare the same names in the global namespace: including<cstdlib>
definitely providesstd::malloc
and may also provide::malloc
. Including<stdlib.h>
definitely provides::malloc
and may also providestd::malloc
. This applies even to functions and function overloads that are not part of C standard library.
对我来说,最后一段表明 GCC 的行为是允许的但不是必需的,因此依赖它是错误的。
最佳答案
规则是 #include <xxx.h>
(其中 xxx.h
是标准 C header 的名称)需要来为全局命名空间中的该 header 定义 C 标准所需的所有名称,并且 < strong>allowed 在命名空间 std
中也定义这些名称(具有相同的含义)。类似地,#include <cxxx>
(其中 cxxx
是标准 C 库的标准 C++ 头文件之一的名称)需要定义命名空间中相应 C 头文件(具有相同含义)的所有名称std
,并且允许在全局命名空间中定义这些名称。
在 C++ 98 中,这些 header 不允许将名称添加到其他命名空间。一些编译器无法做到这一点。例如,如果 C++ 库编写者不控制 C header ,通常的实现技术是将 C++ header 指向 #include
C header ,并使用 using 声明将 C 名称提升到 std
。因此更改了规则以反射(reflect)现实。
语言定义不要求这些 header 将名称放在两个地方;如果是,则不需要 cxxx
header 。
简而言之,您不能指望 #include <cxxx>
将 C 名称放入全局命名空间,但您也不能指望它不将它们放在那里。
关于c++ - 我可以停止 GCC 将标准库名称包含到全局 namespace 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44694574/
我最近在读 CSAPP。在 10.9 节中,它说标准 I/O 不应该与 socket 一起使用,原因如下: (1) The restrictions of standard I/O Restricti
似乎是一个足够标准的问题,可以保证解决方案中的标准设计: 假设我想在文件中写入 x+2(或更少)个字符串。 x 字符串构成一个部分的内容,这两个字符串构成该部分的页眉和页脚。要注意的是,如果内容中没有
代码版本管理 在项目中,代码的版本管理非常重要。每个需求版本的代码开发在版本控制里都应该经过以下几个步骤。 在master分支中拉取该需求版本的两个分支,一个feature分支,
我有以下sql查询,我需要获取相应的hibernate条件查询 SELECT COUNT(DISTINCT employee_id) FROM erp_hr_payment WHERE payment
所以我正在编写一些代码,并且最近遇到了实现一些 mixin 的需要。我的问题是,设计混音的正确方法是什么?我将使用下面的示例代码来说明我的确切查询。 class Projectile(Movable,
我的环境变量包含如下双引号: $echo $CONNECT_SASL_JAAS_CONFIG org.apache.kafka.common.security.plain.PlainLoginModu
示例: /** * This function will determine whether or not one string starts with another string. * @pa
有没有办法在 Grails 中做一个不区分大小写的 in 子句? 我有这个: "in"("name", filters.tags) 我希望它忽略大小写。我想我可以做一个 sqlRestriction
我搜索了很长时间,以查找将哪些boost库添加到std库中,但是我只找到了一个新库的完整列表(如此处:http://open-std.org/jtc1/sc22/wg21/docs/library_t
我已经通过使用这个肮脏的黑客解决了我的问题: ' Filter managerial functions ActiveSheet.Range("$A$1:$BW$2211").Auto
因此,我很难理解我需要遵循的标准,以便我的 Java 程序能够嵌入 HTML。我是否只需将我的主类扩展到 Applet 类,或者我还需要做更多的事情吗?另外,在我见过的每个 Applet 示例中,它都
我对在 Hibernate 中使用限制有疑问。 我必须创建条件,设置一些限制,然后选择日期字段最大值的记录: Criteria query = session.createCriteria(Stora
我有标准: ICriteria criteria = Session.CreateCriteria() .SetFetchMode("Entity1", FetchMo
我很难编写条件来选择所有子集合或孙集合为空的实体。我可以将这些作为单独的条件来执行,但我无法将其组合成一个条件。 类结构: public class Component { p
@Entity class A { @ManyToMany private List list; ... } @Entity class B { ... } 我想使用条件(不是 sql 查询)从 A
我的数据库中有以下表结构: Table A: Table B: Table C: _______________
请帮助我: 我有下一张 table : 单位 ID 姓名 用户 ID 姓名 利率 单位 ID 用户 ID 我不明白如何从 SQL 创建正确的条件结构: 代码: SELECT * FROM Unit W
我正在构建一个包含项目的网站,每个项目都有一个页面,例如: website.com/book/123 website.com/film/456 website.com/game/789 每个项目都可以
我需要使用两个属性的组合来过滤结果列表。一个简单的 SQL 语句如下所示: SELECT TOP 10 * FROM Person WHERE FirstName + ' ' + LastName L
我有一个“ super 实体”SuperEntity 和三个扩展父类(super class)的实体 ChildEntity1、...、ChildEntity3。 搜索数据库中的所有实体很容易,即我们
我是一名优秀的程序员,十分优秀!