hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 1365|回复: 8

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

[复制链接]

948

主题

1162

帖子

3655

积分

超级版主

Rank: 8Rank: 8

积分
3655

论坛头条论坛元老谋士数据帝优秀版主超级版主见习版主论坛版主

发表于 2023-11-2 13:29:28 | 显示全部楼层 |阅读模式
为什么有此一问?

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


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

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

奇了怪了!我打开 #include <compare>,搜索关键字“strong_ordering”,代码片段如下:
  1. 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_orderingstruct 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,会不会再变回去?
世界上最遥远的距离,不是生与死的距离,而是我站在你面前,你却不知道我爱你
回复

使用道具 举报

0

主题

180

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-11-2 13:30:06 | 显示全部楼层
能不要升级就不要升级!
要保持编译程序的稳定!
稳定压倒一切!不折腾!
我以前也喜欢升级软件,而我现在写代码都注明运行软件的版本!
回复

使用道具 举报

0

主题

220

帖子

86

积分

关内侯

Rank: 2

积分
86
发表于 2023-11-2 13:30:59 | 显示全部楼层
对不起,我跟你不同,作为开发者,我就喜欢用最新最炫最标准的技术。
回复

使用道具 举报

0

主题

178

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-11-2 13:31:07 | 显示全部楼层
恩, 其实我也是追新党
我现在用的笔记本同时安装了最新的macos 11.1.  Windows 10 20H2, Manjaro Linux 20.2.
然后凡是用到某工具,某软件第一反映就是 升级一下,看看是不是错过新版本了。。。
我连我的系统引导工具opencore,我都有时不时 的换成最新的版本。。。
并乐在其中。
回复

使用道具 举报

0

主题

186

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-11-2 13:31:52 | 显示全部楼层
也有可能是开始用错了类型,一般AV开头的是媒体库定义的类,一般struct里定义的是纯数据类型,或是比较简单的数据操作。不知道是不是这样。
回复

使用道具 举报

0

主题

201

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-11-2 13:32:41 | 显示全部楼层
原因与上述无关。

这是由 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类型的指针
...
回复

使用道具 举报

0

主题

190

帖子

2

积分

新手上路

Rank: 1

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

使用道具 举报

0

主题

192

帖子

2

积分

新手上路

Rank: 1

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

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

使用道具 举报

0

主题

181

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-11-2 13:33:28 | 显示全部楼层
究竟是 class,还是 struct?
看了这个主题,我都没看到答案
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-24 09:11 , Processed in 0.068590 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表