小编Bri*_*ian的帖子

如何在 C++ 中包含使用 C++ 关键字作为标识符的 C 标头?

我一直在使用 C++ 并使用 clang++ 进行编译。我想包含我正在编写的 X11 程序的<xcb/xkb.h>标头。

不幸的是,这个标头用于explicit某些字段名称(例如第 727 行),而这是 C++ 中的关键字。

有办法解决这个问题吗?

xcb/xkb.h

// ...

#ifdef __cplusplus
extern "C" {
#endif

// ...

typedef struct xcb_xkb_set_explicit_t {
    xcb_keycode_t keycode;
    uint8_t       explicit;
} xcb_xkb_set_explicit_t;

// ...

#ifdef __cplusplus
}
#endif

// ...

Run Code Online (Sandbox Code Playgroud)

c c++ clang

75
推荐指数
3
解决办法
6492
查看次数

为什么 std::is_copy_constructible_v&lt;std::vector&lt;MoveOnlyType&gt;&gt; 为 true?

在我的 clang 和 libc++ 版本(near HEAD)中,这static_assert通过了:

static_assert(std::is_copy_constructible_v<std::vector<std::unique_ptr<int>>>)
Run Code Online (Sandbox Code Playgroud)

当然,如果您实际上尝试复制构造唯一指针的向量,它将无法编译:

../include/c++/v1/__memory/allocator.h:151:28: error: call to implicitly-deleted copy constructor of 'std::unique_ptr<int>'
        ::new ((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
[...]
note: in instantiation of member function 'std::vector<std::unique_ptr<int>>::vector' requested here
    const std::vector<std::unique_ptr<int>> bar(foo);
                                            ^
../include/c++/v1/__memory/unique_ptr.h:215:3: note: copy constructor is implicitly deleted because 'unique_ptr<int>' has a user-declared move constructor
  unique_ptr(unique_ptr&& __u) _NOEXCEPT
Run Code Online (Sandbox Code Playgroud)

我认为这种情况是因为实现在不可复制构造std::vector<T>时不使用 SFINAE 来禁用复制构造函数。T但为什么不呢?标准中是否有规定必须以这种方式工作?这是不幸的,因为这意味着我自己的围绕复制构造性的 SFINAE 并没有在向量方面做正确的事情。

c++ type-traits language-lawyer libc++ c++17

22
推荐指数
1
解决办法
1385
查看次数

从全局变量初始化静态成员时“无效使用非静态数据成员”

class A {
    int x;
    static int i;
};


int x = 10;
int A::i = x;
Run Code Online (Sandbox Code Playgroud)

当我编译上面的代码时,出现错误

<source>:8:12: error: invalid use of non-static data member 'A::x'
    8 | int A::i = x;
      |            ^
<source>:2:9: note: declared here
    2 |     int x;
      |         ^
Run Code Online (Sandbox Code Playgroud)

是什么导致了这个错误?

c++ static-members member-initialization

19
推荐指数
1
解决办法
3133
查看次数

C++23 标准包含哪个版本的 C 标准库?

(我最初的问题是关于“发生了什么_BitInt?”但这是基于对某些 cppreference 页面的误读)。

C++23 标准草案的库简介第 16.2 节表示 C++ 支持 C 标准库。然而,对特定 C 标准的唯一引用是在 16.3 的脚注 (#141) 中。这是 2018 年 C 标准,其中没有提到_BitInt. _BitInt但我在 C 23 标准草案中找到了描述。

C++23 标准是否包含特定版本的 C 标准库?

  • 如果有,是哪一个?
  • 如果没有,是否有一种机制可以合并未来 C 标准的库?

c++ standards language-lawyer c++23

19
推荐指数
2
解决办法
1360
查看次数

在模块 __all__ 中使用列表而不是元组

在许多大型项目中,甚至在Django等项目中,以及在官方 Python 文档中,使用 list 列出文件中“可从外部获得”的模块组件__init__.py

__all__ = [foo, bar, other]
Run Code Online (Sandbox Code Playgroud)

然而,记录

__all__ = (foo, bar, other)
Run Code Online (Sandbox Code Playgroud)

它也会起作用,理论上它不会显着提高代码性能。

为什么,那就用它来列出?

也许有一些我不知道的神奇 PEP?

python tuples list python-import python-3.x

15
推荐指数
2
解决办法
1201
查看次数

为什么 is_trivially_copyable_v 在 GCC 和 MSVC 中不同?

运行这个简单的程序时,根据编译器的不同,会观察到不同的行为。

\n

true在由 GCC 11.2 编译时以及false由带有 的 MSVC 19.29.30137 编译时打印(两者都是今天的最新版本)。

\n
#include <type_traits>\n#include <iostream>\n\nstruct S {\n    int a;\n    \n    S()                     = delete;\n    S(S const &)            = delete;\n    S(S &&)                 = delete;\n    S &operator=(S const &) = delete;\n    S &operator=(S &&)      = delete;\n    ~S()                    = delete;\n};\n\nint main() {\n    std::cout << std::boolalpha;\n    std::cout << std::is_trivially_copyable_v<S>;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

相关引用(来自最新的C++23工作草案N4901):

\n

给定 20.15.5.4 [meta.unary.prop],如果 T 是如 6.8.1/9 [basic.types.general] 中定义的std::is_trivially_copyable_v<T>a,则定义为 true :trivially copyable type

\n
\n

算术类型 …

c++ type-traits language-lawyer c++20

14
推荐指数
1
解决办法
999
查看次数

Powerlevel10k 提示符末尾的 !1 等字符是什么意思?

我正在使用 Oh My Zsh 和 Powerlevel10k 主题。

我直接从 Powerlevel10k 文档安装了推荐的字体,根据文档更新了终端、iTerm2 和 VS Code 中的字体设置,它基本上可以工作,只是提示符末尾总是有一些意外的字符(通常!1是 或!2)。到目前为止,我在文档、论坛搜索或互联网搜索中没有找到任何有助于解决此问题的内容。

提示截图,以开发结束!1提示符的 git status 部分中!2分支名称 ( ) 后面的含义 是什么?develop

任何可以帮助我解决这个问题的提示,甚至只是帮助我找到答案的正确搜索词,都将不胜感激。

git zsh command-prompt git-status oh-my-zsh

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

如何在 Python C API 中创建 Enum 对象?

我正在努力如何在 Python C API 中创建 python Enum 对象。enum 类已赋值tp_basePyEnum_Type,因此它继承了 Enum 。但是,我无法找到一种方法来告诉 Enum 基类枚举中有哪些项目。我想允许使用__members__每个 Python 枚举提供的属性从 Python 进行迭代和查找。

谢谢你,

耶勒

c python python-c-api

8
推荐指数
1
解决办法
808
查看次数

GCC 将 `set` 成员函数与 `std::set` 混淆

以下 C++ 代码给出了 GCC 错误(例如 13.1,请参阅godbolt.org),其中编译器似乎将set成员函数模板与混淆std::set

#include <set>
using namespace std;
template <typename T> struct C {
    template <int S> void set(T const &) { }
};
template <typename T> struct D : C<T> {
    void f(T const & v) { this->template set<0>(v); }
};
Run Code Online (Sandbox Code Playgroud)

它显然与该行有关,但我不明白当它由 显式限定时,using namespace std;编译器如何尝试set在全局或命名空间中查找。谁能启发我吗?stdthis->

c++ gcc compiler-bug

8
推荐指数
1
解决办法
171
查看次数

Haskell 构造类似于 Rust 特征对象

Haskell 支持类型类,例如相等:

class Eq a where 
  (==)                  :: a -> a -> Bool
Run Code Online (Sandbox Code Playgroud)

Rust 对类型特征做了同样的事情:

pub trait Draw {
    fn draw(&self);
}
Run Code Online (Sandbox Code Playgroud)

现在,可以在 Haskell 中声明一个列表,其元素必须属于相等类型类:(Eq a => [a]我相信在 Haskell 中a称为约束类型)。但是,列表的元素仍然必须是同一类型!说,全部Integer或全部Float或某事。然而,在 Rust 中,人们可以拥有一个值列表(向量),其中每个值都实现给定的特征,但它们不一定是相同的具体类型:Vec<Box<dyn Draw>>。有没有办法在 Haskell 中做同样的事情?就像,我想要一个值列表,但我关心的是每个值都属于某个类型类,但不一定是相同的具体类型。

haskell

7
推荐指数
1
解决办法
212
查看次数