6 minute read

本篇文章汇总了 C 与 C++ 学习的相关资源,包括语言基础、标准库、跨平台开发、性能优化等内容,适合系统级开发者参考。

Reference

Libraries

GMP

GMP大数库是GNU项目的一部分,诞生于1991年。作为一个任意精度的大整数运算库,它包括了任意精度的整数、浮点数的各种基本运算操作。它是一个C语言的库,但是官方提供了C++的包装类,主要的应用方向是密码学、网络安全、代数系统、计算科学等。GMP库的运行速度非常快,它的官方网站上称自己为地球上最快的大数库,但是GMP库所提供的只是数学运算功能,并没有密码学相关的高级功能。

Miracl

Miracl库是Shamus Software Ltd开发的一个大数库,它的使用许可针对教育科学研究或者非商业目的的应用是免费的。它是一个C语言的库,同时提供了几个较为简单的c++包装类。在功能上它不但提供了高精度的大整数和分数的各种数学运算操作而且提供了很多密码学算法中的功能模块,如SHA、AES、DSA等中的一些底层操作。最为特别的是它还提供了很多椭圆曲线密码体制中的底层功能模块。由于Miracl库的内部实现采用了很多的汇编代码,故运行速度也非常快。

Crypto++

Crypto++库是一个开源项目。由于它是一个纯C++实现的库,所以应用非常的方便,库的结构清晰,文档也很健全。Crypto++库提供了很多密码学算法的实现。

OpenSSL

OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件包,由加拿大的Eric Yang等发起编写的。它可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字等。

libcstl

Windows C++

Visual C++参考

需要整理的

Linux C++

Linux中C语言如何清空标准输入流

今天在Linux程序设计的时候需要清空标准输入缓冲区,于是使用了如下Windows程序设计中的方法: fflush(stdin),这个fflush()函数根本不是标准C中的函数,只是标准C的扩展,所以在Linux中使用根本不行;在网上搜索了下,发现有网友建议使用rewind(stdin);这个函数其实是将指针指向流的开始处。但是它是文件操作中的一个函数,操作的是FILE型流,在Windows程序设计中是可以清空标准输入缓冲区的,但是在Linux中不行。

注: 上述内容有几处错误,详见《The Standart Library》

Linux上可以通过getchar()函数读完标准缓冲区中的剩余字符来清空标准缓冲区:

char ch;
while((ch=getchar())!='/n'&&ch!=EOF);

Windows/Linux剪不断理还乱

MinGW-w64不同版本选择

x86_64-15.2.0-release-posix-seh-ucrt-rt_v13-rev0

  • x86_64/i686代表目标操作系统。
    • x86_64是64位的操作系统,
    • i686是32位的操作系统。
  • 15.2.0是GCC的版本号。
  • posix/win32代表API风格。
    • posix是为类Unix系统(如Linux和macOS)设计的API风格。如果你的程序需要在这些系统上运行,或者你的代码依赖于POSIX API,你应该选择带有posix的工具链。
    • win32是为Windows系统设计的API风格。如果你的程序主要面向Windows用户,或者你的代码依赖于Windows特有的API,你应该选择带有win32的工具链。
  • sjlj/seh/dwarf代表异常处理机制。
    • SJLJ表示这个工具链使用“Setjmp/Longjmp”异常处理机制。SJLJ是一种更传统的异常处理方式,它通常用于那些不支持或不完全支持Windows结构化异常处理(SEH)的操作系统。
    • SEH表示这个工具链使用Windows的结构化异常处理(Structured Exception Handling, SEH)。SEH是Windows平台上常用的异常处理机制,它提供了更丰富的异常信息和更灵活的异常处理逻辑。如果你的代码需要与Windows平台的特性紧密集成,或者你的程序主要运行在Windows上,SEH可能是一个更好的选择。
    • What is difference between sjlj vs dwarf vs seh? https://stackoverflow.com/questions/15670169/what-is-difference-between-sjlj-vs-dwarf-vs-seh 运行时库
  • ucrt/msvcrt代表运行时库的类型。
    • ucrt是Universal C Runtime的缩写,它是Windows 10及更高版本中包含的一个新运行时库。它提供了与操作系统更紧密集成的API,并通常用于更现代的Windows应用程序。如果你的目标平台是Windows 10或更高版本,并且你希望利用最新的API和功能,ucrt可能是一个好选择。 使用ucrt的库通常比使用msvcrt的库更小,因为它们不包含一些旧的、不再需要的API。
    • msvcrt是Microsoft C Runtime的缩写,它是Microsoft提供的传统C运行时库。 它提供了广泛的API支持,包括一些旧的、可能不再常用的API。如果你的代码依赖于msvcrt特有的API,或者你需要确保你的程序能在较旧的Windows版本上运行,msvcrt可能更适合你。
  • rt_v13通常指的是“runtime”,即运行时库版本号。

C++近场通讯开发

Dev-C++

CMake

XMake

GDB

包管理器

一点经验教训

C/C++由于历史原因,编译,构建难度相对于目前主流的其他语言如Java、Python、Go等要大的多,不同操作系统平台,不同编译工具差别很大,且没有一个完美的包管理工具,为了少花时间到环境配置上,推荐选型如下:

  • 如果是Windows平台,且基本没有依赖,建议配套CLION+CMAKE+GCC(MinGW);
  • 如果是Windows平台,且依赖较多,比如Gtest,OpenSSL,建议配套VS+VCPKGS;
  • 如果是Linux平台,CLION+CMAKE+GCC

Glib/GTK+/Gnome

GTK中的delete_event和destroy

  • delete_event 事件一般由用户或者说用户通过窗口管理器产生,即点击窗口右上角的退出按钮。假如不做任何特殊处理,窗口管理器会自动产生destroy信号;如果我们自 定义了处理delete_event事件的回调函数,是否产生destroy信号就和函数的返回值有关,如果是FALSE就产生,反之则没有效果。
  • destroy,除了可以由delete_event事件产生之外,还可以通过gtk_widget_destroy函数与其它信号发生交换。同样,如果不加指定,默认结果是关闭所指向的窗口但并不结束进程。如果我们希望主窗口和进程一起关闭,必须使用gtk_main_quit()。

QT

wxWidgets

Duilib

Doxygen

Unit Test

日志

MPI

Ctags

CLIPS

CLIPS is a productive development and delivery expert system tool which provides a complete environment for the construction of rule and/or object based expert systems.

Xapian

Xapian is an Open Source Search Engine Library, released under the GPL v2+. It's written in C++, with bindings to allow use from Perl, Python, PHP, Java, Tcl, C#, Ruby, Lua, Erlang and Node.js (so far!)

ACE/TAO

ACE is an open-source framework that provides a rich set of reusable C++ wrappers and frameworks that perform common communication software tasks across a range of OS platforms. TAO is an open-source, real-time implementation of the CORBA standard.

标准C/C++语法知识点

Others

Comments