C++ 为什么不再支持 U+00B7(中点)作为首标识符?有可能关闭标识符检查吗?

2026-06-01T02:57:34.15+00:00

一个项目之前使用了如下的点乘宏包装:

constexpr auto dot(in<crdsr> i, in<crdsr> j) noexcept { return i.x * j.x + i.y * j.y + i.z * j.z; }
constexpr auto dot(in<crdpr> i, in<crdpr> j) noexcept { return i.x * j.x + i.y * j.y; }
constexpr auto dot(cs::normal auto i, cs::normal auto j) noexcept { return dot(rct(i), rct(j)); }
constexpr struct dot_tag {} _dot_;
template<cs::normal T> struct dot_opr { T data; constexpr explicit dot_opr(T v) noexcept : data(v) {} };
template<cs::normal T> constexpr dot_opr<T> operator<<(T lhs, in<dot_tag>) noexcept { return dot_opr<T>(lhs); }
template<cs::normal T> constexpr auto operator>>(dot_opr<T> lhs, T rhs) noexcept { return dot(rct(lhs.data), rct(rhs)); }
#define · <<_dot_>>

之后点乘时只需要写 i · j 就能进行内联的双目点乘运算,这在 VS2022 中一直可以正常、安全地编译通过。

今天环境更新成 VS2026 后,全项目到处报错 C3873【‘+b7’: 不允许将此字符作为标识符的第一个字符】,这让我非常头大。我不太想把各文件引用改成看起来有些丑的【_·】等,请问如何在不改旧代码的前提下解决这一问题呢?

开发人员技术 | C++
开发人员技术 | C++

一种通用的高级编程语言,作为 C 编程语言的扩展而创建,除了用于低级别内存操作的功能外,还具有面向对象、泛型和功能性等特点。

0 个注释 无注释

你的答案

提问者可以将答案标记为“已接受”,审查方可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。