败犬日报 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++ 的各种字符类型
- char
- signed char
- unsigned char
- char8_t
- char16_t
- char32_t
- std::byte
- wchar
互不相同。
7. 项目 A 依赖 b_1 库,还间接依赖 C 库,C 库又依赖 b_2 库,现在出现冲突了
b_1,b_2 是一个库的不同版本。
如果可以修改 C 库,让 C 库隐藏 b_2 的符号。
如果不能修改 C 库?(问题待解决)