矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 1473|回复: 28

C++20标准对C++14的兼容性如何? C++14项目升级C++20需要修改代码吗?

[复制链接]
     
发表于 2024-10-28 13:39:26 来自手机 | 显示全部楼层 |阅读模式
C++20标准对C++14的兼容性如何?
C++14项目升级C++20需要修改代码吗?
     
发表于 2024-10-28 13:59:55 | 显示全部楼层
应该没问题,编译下试试
就算有问题,也能通过写成动态库,导出接口
回复 支持 反对

使用道具 举报

     
发表于 2024-10-28 14:50:12 | 显示全部楼层
C++ 太过复杂了,没人敢说精通 C++ 的所有方面,估计在本坛敢说自己熟练掌握 C++ 的都没有。

不过你担心的兼容性问题,俺觉得不会有什么大麻烦,毕竟保持向下兼容性是任何语言版本升级首先要考虑的事情 (Python 除外 )。

Screenshot 2024-10-28 174331.jpg
回复 支持 反对

使用道具 举报

发表于 2024-10-28 16:37:55 | 显示全部楼层
不同的编译器不一样。例如gcc(g++)编译的时候,后面方框里打个勾,或者命令行指定-std=c++11。
其实根本不用关注那么多,大多数情况C++11就行,2024年了,大部分编译器对C++17支持的都残缺不全。
cpp11.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-10-28 16:47:30 | 显示全部楼层
JuncoJet 发表于 2024-10-28 13:59
应该没问题,编译下试试
就算有问题,也能通过写成动态库,导出接口

现在没有代码,chipset009那本书是C++14的
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-10-28 16:53:18 | 显示全部楼层
scoopydoo 发表于 2024-10-28 14:50
C++ 太过复杂了,没人敢说精通 C++ 的所有方面,估计在本坛敢说自己熟练掌握 C++ 的都没有。

不过你担心 ...

这些特性基本都用不到,C++14有的那些特性也都被后续标准继续支持
我比较担心的是STL标准模板库的用法C++20对C++14是不是都兼容
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-10-28 16:56:50 | 显示全部楼层
chipset009 发表于 2024-10-28 16:37
不同的编译器不一样。例如gcc(g++)编译的时候,后面方框里打个勾,或者命令行指定-std=c++11。
其实根本不 ...

常用的特性没有变化就可以了,C++11好像有个别特性被后来的标准废弃或者修改
回复 支持 反对

使用道具 举报

发表于 2024-10-28 17:05:11 | 显示全部楼层
ustone 发表于 2024-10-28 16:56
常用的特性没有变化就可以了,C++11好像有个别特性被后来的标准废弃或者修改

Unicode,后来去掉了,最蛋疼的就这玩意了,再后来标准貌似没有加上。
STL不用担心,C++23一路能兼容到C++98,只是越后来写法越简单而已。

C++里复杂的地方有几处,重载协议,模板,并发控制(原子操作,mutex,条件变量...)。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-10-28 17:12:58 | 显示全部楼层
chipset009 发表于 2024-10-28 17:05
Unicode,后来去掉了,最蛋疼的就这玩意了,再后来标准貌似没有加上。
STL不用担心,C++23一路能兼容到C ...

我写的小程序代码基本还是按C++98标准,不过要用一些STL库,曾经发现random_shuffle函数用法C++11跟C++98好像不太一样
回复 支持 反对

使用道具 举报

发表于 2024-10-28 17:14:52 | 显示全部楼层
C++是个讲人权的地方,你想怎么样都行,但后果自负。所以我觉得,能用C则用C,能用JAVA或则用JAVA或者C#,能用脚本则用脚本,除非迫不得已,否则还是远离C++比较好。

举个例子吧,调用一个函数,这玩意简单的不能再简单了。在C++里看上去也有点复杂,你可以不那么写,但你约束不了别人怎么写。
int foo(int n)
{
  int s = 1;
  for(; 0 < n; --n)
    s *= n;
  return s;
}

class C
{
public:
  C() = default;
  explicit C(int a) : y(a) {}
  ~C() = default;
  int foo(int x) const { return x + y; }

private:
  int y;
};

#include <functional>
#include <string>
#include <iostream>

int main()
{
  typedef int (*f_int_t1) (int); // the old style
  f_int_t1 foo_p1 = &foo;        // & is redundant and optional
  using f_int_t2 = int (*)(int); // easy to understand
  f_int_t2 foo_p2 = foo;
  std::function<int(int)> stdf_foo = &foo; // modern

  const std::string Sep(" ");
  constexpr int N = 5;

  std::cout << "global function:" << foo(N) << Sep << foo_p1(N) << Sep
            << foo_p2(N) << Sep << stdf_foo(N) << "\n";

  typedef int (C::* f_C_int_t1) (int) const;
  f_C_int_t1 C_foo_p1 = &C::foo;  // the old style
  using f_C_int_t2 = int (C::*) (int) const;
  f_C_int_t2 C_foo_p2 = &C::foo;

  const C c(10);
  constexpr int X = 20;

  std::cout << "old member call: " << (c.*C_foo_p1)(X) << Sep << (c.*C_foo_p2)(X) << "\n";

  std::function<int(const C&, int)> stdf_C_foo = &C::foo;
  auto greet = std::mem_fn(&C::foo);
  auto callback = std::bind(&C::foo, &c, std::placeholders::_1);
  std::cout << "new member call: " << stdf_C_foo(c, X) << Sep << greet(c, X) << Sep
            << callback(X) << "\n";

  return 0;
}
回复 支持 反对

使用道具 举报

     
发表于 2024-10-28 17:17:22 | 显示全部楼层
ustone 发表于 2024-10-28 16:47
现在没有代码,chipset009那本书是C++14的

若你只是拿来学习或者做些小的实用工具,完全不必担心这些东西 ......
回复 支持 反对

使用道具 举报

     
发表于 2024-10-28 17:19:40 | 显示全部楼层
chipset009 发表于 2024-10-28 17:14
C++是个讲人权的地方,你想怎么样都行,但后果自负。所以我觉得,能用C则用C,能用JAVA或则用JAVA或者C#, ...


俺完全同意你的观点,但是不赞同你贴代码的方式!

  1. int foo(int n)
  2. {
  3.   int s = 1;
  4.   for(; 0 < n; --n)
  5.     s *= n;
  6.   return s;
  7. }

  8. class C
  9. {
  10. public:
  11.   C() = default;
  12.   explicit C(int a) : y(a) {}
  13.   ~C() = default;
  14.   int foo(int x) const { return x + y; }

  15. private:
  16.   int y;
  17. };

  18. #include <functional>
  19. #include <string>
  20. #include <iostream>

  21. int main()
  22. {
  23.   typedef int (*f_int_t1) (int); // the old style
  24.   f_int_t1 foo_p1 = &foo;        // & is redundant and optional
  25.   using f_int_t2 = int (*)(int); // easy to understand
  26.   f_int_t2 foo_p2 = foo;
  27.   std::function<int(int)> stdf_foo = &foo; // modern

  28.   const std::string Sep(" ");
  29.   constexpr int N = 5;

  30.   std::cout << "global function:" << foo(N) << Sep << foo_p1(N) << Sep
  31.             << foo_p2(N) << Sep << stdf_foo(N) << "\n";

  32.   typedef int (C::* f_C_int_t1) (int) const;
  33.   f_C_int_t1 C_foo_p1 = &C::foo;  // the old style
  34.   using f_C_int_t2 = int (C::*) (int) const;
  35.   f_C_int_t2 C_foo_p2 = &C::foo;

  36.   const C c(10);
  37.   constexpr int X = 20;

  38.   std::cout << "old member call: " << (c.*C_foo_p1)(X) << Sep << (c.*C_foo_p2)(X) << "\n";

  39.   std::function<int(const C&, int)> stdf_C_foo = &C::foo;
  40.   auto greet = std::mem_fn(&C::foo);
  41.   auto callback = std::bind(&C::foo, &c, std::placeholders::_1);
  42.   std::cout << "new member call: " << stdf_C_foo(c, X) << Sep << greet(c, X) << Sep
  43.             << callback(X) << "\n";

  44.   return 0;
  45. }
复制代码
回复 支持 反对

使用道具 举报

     
发表于 2024-10-28 19:21:40 | 显示全部楼层
scoopydoo 发表于 2024-10-28 14:50
C++ 太过复杂了,没人敢说精通 C++ 的所有方面,估计在本坛敢说自己熟练掌握 C++ 的都没有。

不过你担心 ...

"精通"这个词太不精确了。又不能当饭吃,要那么"精通"干什么

在C++11之前,我有事没事就翻iso14882。背下来不敢说,但哪个特性在哪一章,有哪些相关条款,我都能记个大概。这算"精通"嘛?
这个不算的话,我还手撸过C++前端,C++98的语法基本上支持得七七八八了。GCC和Clang咱也改过些许。
实在不行还可以算上我自己写过汇编器,链接器和调试器。再不行算上我自己写的CRT和部分STL呢?

但上面那一堆东西都没给我换来一顿饭吃。最近感觉很多基本语法都已经开始遗忘了。
有生之年我估计能做到手中没有C++,心中也没有C++的至高境界了
回复 支持 反对

使用道具 举报

     
发表于 2024-10-28 20:24:35 | 显示全部楼层
scu319hy 发表于 2024-10-28 19:21
"精通"这个词太不精确了。又不能当饭吃,要那么"精通"干什么

在C++11之前,我有事没事就翻iso148 ...

你已经很厉害了,但是,你甚至都没达到熟练掌握 C++ 的程度。

举个栗子吧,作为中国人,母语是汉语,大部分成年人算是熟练掌握汉语,极少数语言学专家算是精通汉语。

131507275_263810202086537_8165836765346057034_n.jpg
回复 支持 反对

使用道具 举报

     
发表于 2024-10-28 20:39:38 | 显示全部楼层
吾生也有涯,而知也无涯。以有涯随无涯,殆已!还在追求C++的人,殆而已矣!坚决拒绝死嚼C加加。编程语言这些玩意儿对我来说就是让芯片转起来,让仿真跑起来的工具。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-29 00:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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