Skip to content

败犬日报 2024-11-25

1. 函数保证 const 参数不变吗

不保证,原因是 const_cast

cpp
struct A {
    int x;
};
void bar(const A* a);
int foo() {
    A a{114514};
    bar(&a);
    return a.x;
}

这里 foo 不一定返回 114514,bar 用 const_cast 可以改变 a 的值。

没有保证参数不变的语法。llvm ir 里面的 readonly attribute 似乎更符合这个语义,但是不知道为啥 clang 前端没暴露。

2. gnu::const

GCC/clang 的 __attribute__((const)) / [[gnu::const]] 可以标记一个函数无副作用、不读取全局变量。

https://clang.llvm.org/docs/AttributeReference.html#const

类似属性 pure 会弱一点,只保证无副作用。

3. C 语言 void f(int a[static 10]) {}

标记 a[0] ... a[9] 是合法的。C++ 没有这个语法。

4. C++为什么允许给临时对象赋值? - Mick235711的回答 - 知乎

https://www.zhihu.com/question/533946012/answer/2509921643

5. 主程序没引用静态库里面的符号,可能导致静态库整个被丢弃,里面的全局变量初始化的副作用也会没

链接器有链接选项 --whole-archive,阻止符号被丢弃。

除此之外,弄成动态库也行。

6. C++ 的各种字符类型

  1. char
  2. signed char
  3. unsigned char
  4. char8_t
  5. char16_t
  6. char32_t
  7. std::byte
  8. wchar

互不相同。

7. 项目 A 依赖 b_1 库,还间接依赖 C 库,C 库又依赖 b_2 库,现在出现冲突了

b_1,b_2 是一个库的不同版本。

如果可以修改 C 库,让 C 库隐藏 b_2 的符号。

如果不能修改 C 库?(问题待解决)