gxqcn 发表于 2020-12-24 16:02:50

std::strong_ordering 该是 class,还是 struct?

为什么有此一问?

在疫情歇业期间,我曾发了个帖子:发现微软编译器三路比较运算(<=>)的一个大 bug!


现在又发现一个跟此相关的新问题:

由于工作忙,业余项目暂停了好久,期间 VS2019 曾有过多次升级,包括对上述 bug 的修复,
早上心血来潮,把那个项目试着重新编译一下,居然通不过!怎么着都编译不过!
警告为:error LNK2001: 无法解析的外部符号 "class std::strong_ordering ..."

奇了怪了!我打开 #include <compare>,搜索关键字“strong_ordering”,代码片段如下:
inline constexpr weak_ordering weak_ordering::less{static_cast<_Compare_t>(_Compare_ord::less)};
inline constexpr weak_ordering weak_ordering::equivalent{static_cast<_Compare_t>(_Compare_eq::equivalent)};
inline constexpr weak_ordering weak_ordering::greater{static_cast<_Compare_t>(_Compare_ord::greater)};

// CLASS strong_ordering
struct strong_ordering {
    static const strong_ordering less;
    static const strong_ordering equal;
    static const strong_ordering equivalent;
    static const strong_ordering greater;

    constexpr operator partial_ordering() const noexcept {
      return {static_cast<_Compare_t>(_Value)};
    }


这个代码显示的 strong_ordering 是 struct,提示怎么说是 class ?
这才意识到,我的 dll 是以 def 文件导出的,可能是导出接口发生了改变,
试着将 .def 文件中的“AVstrong_ordering”字串替换成“AUstrong_ordering”,再编译,就通过了!

这肯定是微软中途曾变更过它的声明方式,从 class 变更成了 struct(上述代码中,还特别保留了一行注释“// CLASS strong_ordering”),
其中之一肯定不符合标准规范。

但标准规范又是什么呢?class?struct?
查阅:std::strong_ordering,里面的规定是 class!

对于 C++ 来说,两者并没有本质区别,
但对于导出接口来说,它们就有区别了!

不知微软为何要将它从 class 变更到 struct,会不会再变回去?

mathematica 发表于 2020-12-25 16:14:50

能不要升级就不要升级!
要保持编译程序的稳定!
稳定压倒一切!不折腾!
我以前也喜欢升级软件,而我现在写代码都注明运行软件的版本!

gxqcn 发表于 2020-12-25 16:41:23

对不起,我跟你不同,作为开发者,我就喜欢用最新最炫最标准的技术。

wayne 发表于 2020-12-25 17:10:48

恩, 其实我也是追新党
我现在用的笔记本同时安装了最新的macos 11.1.Windows 10 20H2, Manjaro Linux 20.2.
然后凡是用到某工具,某软件第一反映就是 升级一下,看看是不是错过新版本了。。。
我连我的系统引导工具opencore,我都有时不时 的换成最新的版本。。。
并乐在其中。

灵树 发表于 2021-1-4 12:05:52

也有可能是开始用错了类型,一般AV开头的是媒体库定义的类,一般struct里定义的是纯数据类型,或是比较简单的数据操作。不知道是不是这样。

gxqcn 发表于 2021-1-4 15:42:43

灵树 发表于 2021-1-4 12:05
也有可能是开始用错了类型,一般AV开头的是媒体库定义的类,一般struct里定义的是纯数据类型,或是比较简单 ...

原因与上述无关。

这是由 C++ 编译时函数名修饰约定规则决定的:

修饰名是编译器在编译函数定义或者原型时生成的字符串。

参数表的拼写代号表示:
X--void
D--char
E--unsigned char
F--short
H--int
I--unsigned int
J--long
K--unsigned long(DWORD)
M--float
N--double
_N--bool
U--struct
V--class

PA--表示指针
PB--表示const类型的指针
...

mathematica 发表于 2021-1-11 09:54:15

我以前用vim写脚本,但是vim升级后,软件的特性就改变了,不仅仅是vim,
我以前画图,看到老员工用很老版本的AutoCAD,然后我用最新版本的AutoCAD,然后我就觉得老员工很落后,跟不上时代,
后来有一天,我终于领悟到:不是老员工落伍,而是老员工追求软件的稳定性,不仅仅是软件运行的稳定性,还与软件的特性的稳定性、操作习惯的稳定性!
而这些稳定性,随着升级很可能被打破,需要重新适应!
所以我后来写脚本,一概注明编写脚本软件的版本,运行脚本软件的版本,以及操作系统的版本,然后我也讨厌升级了!
我终于变成了我被曾经的自己所鄙视的“老同志”!

风云剑 发表于 2021-1-11 11:46:16

追求稳定而不去升级很正常,但并不一定是个好的做法。
软件升级,很多时候是增加了新的特性,如果不使用这些新的东西,一直使用旧版本确实没问题。但时间长了,很多情况是你不得不更新。而这时不论是软件本身,还是操作习惯都已经变化巨大了,重新适应其实更痛苦,还不如定期更新,不一定要追求最新,但至少不能太落伍。
windows的兼容性是一流的,十几年前的软件至今还能运行,你一定要停留在十几年前也还问题不大。
linux可就没这么友好了,老的软件包现在已经不好找,即使找到也不容易编译,一大推的依赖包都要找老版本,编译成了也不一定能正常使用。

如今飞速发展的科技,就是一辆高速列车,不抓紧了,必定被甩下车去……

nyy 发表于 2023-7-21 13:41:40

究竟是 class,还是 struct?
看了这个主题,我都没看到答案
页: [1]
查看完整版本: std::strong_ordering 该是 class,还是 struct?