相关疑难解决方法(0)

什么是内联命名空间?

C++ 11允许inline namespaces,其所有成员也自动在封闭中namespace.我想不出任何有用的应用 - 有人可以给出一个简短,简洁的例子,说明inline namespace需要哪种情况以及最常用的解决方案?

(另外,当发生了什么并不清楚,我namespace声明inline在一个但不是所有的声明,这可能住在不同的文件.这难道不是找麻烦?)

c++ namespaces c++11 inline-namespaces

320
推荐指数
6
解决办法
5万
查看次数

如何在预处理器中检测-stdlib = libc ++?

我认为这是在LLVM/Clang下编译时名称空间'std'中名为'unique_ptr'的No类型问题的一部分.据Marshall Clow说,我可以-stdlib=libc++通过_LIBCPP_VERSION以下方式检测:

如果您正在编写跨平台代码,有时您需要知道您正在使用的标准库.从理论上讲,它们都应该提供相同的功能,但这只是理论.有时你只需要知道.检查libc ++的最佳方法是查找预处理器符号_LIBCPP_VERSION.如果已定义,那么您正在使用libc ++.

#ifdef  _LIBCPP_VERSION
//  libc++ specific code here
#else
//  generic code here
#endif
Run Code Online (Sandbox Code Playgroud)

不幸的是,在从LLVM项目下载后,我使用Apple的Clang(3.4-SVN)和Clang(3.6)来解决这个问题.我猜这个测试只在Xcode下有效.

如何-stdlib=libc++在预处理器中可靠地检测?


以下是测试用例:

$ cat test-clapple.cxx

// Need to test {C++03,C++11} x {libc++, no libc++}

// c++ -c test-clapple.cxx
//     - OK
// c++ -stdlib=libc++ -c test-clapple.cxx
//     - OK
// c++ -std=c++11 -c test-clapple.cxx
//     - FAILS, no type named 'unique_ptr' in namespace 'std'
// c++ -std=c++11 -stdlib=libc++ -c test-clapple.cxx
// …
Run Code Online (Sandbox Code Playgroud)

c++ llvm clang c-preprocessor libc++

12
推荐指数
1
解决办法
2981
查看次数

__1符号来自何处使用LLVM的libc ++?

在IOS 64位项目中,我看到了大量的问题,如Apple Mach-O Linker(Id)错误cryptopp中的未定义符号.问题通常描述为:

Undefined symbols for architecture i386:
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from:
      cv::gpu::error(char const*, char const*, int, char const*) in opencv2(gpumat.o)
Run Code Online (Sandbox Code Playgroud)

问题通常会减少到混合/匹配-stdlib=libc++(LLVM C++运行时)和-stdlib=libstdc++(GNU C++运行时).LLVM的C++运行时(libc++)具有__1装饰符号,但GNU C++运行时libstdc++ 缺少__1在其名称符号.它会导致符号显示具有相同名称的链接器问题(如std::string).

__1使用LLVM的libc ++时,符号来自何处?

为什么这个问题不是一个解决gnu命名和llvm命名空间?


这是一个相关的问题:libc ++ - 停止std重命名为std :: __ 1?.但它有点忽略了重命名不会发生的重点.

c++ symbols libstdc++ libc++

9
推荐指数
1
解决办法
3917
查看次数