ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在libc中的内联命名空间中转发声明类的可移植方法是什么?

2019-08-24 07:15:58  阅读:253  来源: 互联网

标签:c c11 clang libc-2


仅当我将-stdlib = libc指定为clang时,以下代码才会编译:

namespace std {
  class mutex;
}

void f(std::mutex &x);

#include <mutex>

void f(std::mutex &x) { }

> http://goo.gl/Uqpv6f(gcc.godbolt.org)

note: candidate found by name lookup is ‘std::__1::mutex’

我明白什么是:: __ 1那里,

> Where does the __1 symbol come from when using LLVM’s libc++?

但在我看来,libc打破了C标准定义的API:

> http://en.cppreference.com/w/cpp/thread/mutex(嗯,这不是真正的标准…)

应该可以转发声明std :: mutex,因为它应该直接驻留在std下,不应该吗?

请注意,编译阶段而不是链接阶段失败.所以我不认为我的问题的答案应该是“因为libc使用了与GNU libstdc不同的ABI ……”

解决方法:

but to my eyes, libc++ breaks the API defined by the C++ standard:

实际上,它没有.该标准在[contents]中指定:

It is unspecified whether names declared in a specific
namespace are declared directly in that namespace or in an inline namespace inside that namespace.

允许libc将互斥锁放入内联命名空间__1.请注意,有good reasons个需要内联命名空间,通常作为用户,您甚至不关心它们是否存在.

对于您的特定问题,您仍然可以使用libc向前声明std :: mutex …您只需要包含所有命名空间(有关如何检测-std = libc,请参阅this question):

namespace std {
#ifdef _LIBCPP_VERSION
    inline namespace __1 {
        struct mutex;
    }
#else
    struct mutex;
#endif
}

但是,从[namespace.std]:

The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a
namespace within namespace std unless otherwise specified.

前向声明仍然是一个声明,因此即使上面的内联命名空间占用的版本也是未定义的行为.所以更喜欢直接这样做:

#include <mutex>

标签:c,c11,clang,libc-2
来源: https://codeday.me/bug/20190824/1705843.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有