PostsMapsLinks
Cpp

C++

C++ 是一种静态类型、编译式、通用、多范式编程语言

主题

概述

C++ 是一种多范式编程语言,支持过程化编程、面向对象编程和泛型编程。作为 C 语言的扩展,C++ 在系统编程、游戏开发、嵌入式系统和高性能计算领域有着广泛的应用。

C++ 的跨语言互操作能力(如 PInvoke)使其能够与其他语言(如 C#)无缝协作,调用动态链接库中的函数。这使得 C++ 成为构建底层库和驱动程序的理想选择,而高层应用可以使用更现代的语言进行开发。

C++ 拥有丰富的构建工具链和标准化体系,从 Makefile 到现代构建系统(如 CMake、Bazel),以及不断演进的语言标准(C++11/14/17/20/23),为开发者提供了强大的工程能力。

FAQ

C++ 使用字符串一定要 #include <string> 吗

#include <iostream>
// #include <string>

如果引入 iostream,会间接引用 string 头文件,所以就算注释掉第二行,程序也能正常编译运行。如果去掉注释,由于 C++ 头文件使用了 #ifnfef #define #endif 所以不会二次引入,程序同样能正常编译运行。

为什么尽量不要使用 using namespace std

如果是在源码里面用则无所谓,但是如果放到了头文件里,被其它代码引入了,那很容易带来困惑。如果想在头文件里用,最好用自己的命名空间包一层,同时做最小暴露,如使用 vector 那就 using std::vector。

PInvoke 是什么?

PInvoke 既 Platform Invocation Services 平台调用服务,允许你使用 C# 之类的语言调用外部函数。比如,许多硬件中,其驱动是用 C/C++ 写的,而用 C# 在外面再套一层壳子来管理界面( WPF/Winform)。这时,可以使用 PInvoke 方法让 C# 去调用动态链接库中的函数。

《手把手教你 PInvoke》

可以在 C# 中使用 DLLImport 标记链接库并引入其中函数。

public class Win32
{
    [DllImport("user32.dll")]
    public static extern IntPtr MessageBox(
      int hWnd,
      String text,
      String caption,
      uint type
    );
}
class Program
{
    static void Main(string[] args)
    {
        Win32.MessageBox(0, "Hello, World", "Hi~", 0);
        Console.ReadLine();
    }
}

如果不知道有什么方法可以用、方法对应哪个动态链接库以及参数是啥,都可以上官方文档中找,里面有函数作用及签名等详细的说明。也可以到 pinvoke.net 找到已经汇总好的代码。

《使用 PInvoke 互操作,让 C#和 C++愉快的交互优势互补》

介绍了如何使用 Visual Studio 创建一个 C++ 动态链接库并在 C# 中调用。

要了解托管代码和非托管代码的函数签名的类型转换,可以查阅官方文档。

如果碰到复杂类型,可以使用 PInvoke Interop Assistant 工具自动转换代码。

此外,在 C++ 中,可以通过函数指针直接接受来自 C# 的委托函数,十分令人愉快。

Copyright © 2024 Lionad - CC-BY-NC-CD-4.0