C++中的__PRETTY_FUNCTION__ 、__FUNCSIG__和std::source_location

__PRETTY_FUNCTION__ 是一个预编译器宏,主要用在C++中。这个宏会被编译器替换为当前函数的完整签名,包括函数名、参数类型列表以及所属类名(如果是类的成员函数的话)。

这个宏常用于调试,因为它可以帮助开发者确定正在执行的具体函数。例如,可以将其用于日志记录,以跟踪函数的调用情况。

例如:

void someFunction(int a, double b)
{
    std::cout << __PRETTY_FUNCTION__ << " called with " << a << " and " << b << std::endl;
}

在这个例子中,如果调用 someFunction(3, 4.2),则会打印出如下信息:

void someFunction(int, double) called with 3 and 4.2

需要注意的是,__PRETTY_FUNCTION__ 是GCC编译器特有的,其他编译器可能不支持,或者提供了类似的但名字不同的宏。例如,在Visual C++中,相应的宏是__FUNCSIG__。 

__FUNCSIG__ 打印的方式和__PRETTY_FUNCTION__略有不同,可自行测试。

_PRETTY_FUNCTION__ 是一个编译器特定的宏,主要在GCC和Clang编译器中使用。这个宏不是C标准的一部分,所以并不能保证所有C编译器都支持它。

C标准中提供了 __func__ 这个宏,它可以被所有支持C11及以上版本的编译器识别。然而 __func__ 只返回函数的名称,而不包括类名或参数类型等信息。如果你需要一个跨编译器的解决方案,__func__ 可能是个不错的选择。但如果你需要更详细的信息,且你的代码只需在GCC或Clang上运行,那么 __PRETTY_FUNCTION__ 是个好的选择。

在C++20标准中,提出了一个新的特性叫做source_location,它提供了一个标准的、可移植的方式来获取源代码的位置信息,包括文件名、行号、函数名等。不过,source_location还没有被所有编译器支持。

std::source_location 是C++20新增的一个库,它提供了源代码位置的信息,主要包括以下几个部分:

  1. line():返回源代码的行号。

  2. column():返回源代码的列号。

  3. file_name():返回源代码的文件名。

  4. function_name():返回函数的名称。

它可以用于提供更准确的诊断信息,以帮助定位问题。下面是一个简单的使用示例:

#include <iostream>
#include <source_location>

void log(const char* message,
  const std::source_location& location = std::source_location::current())
{
    std::cout << "info: "
              << location.file_name() << ":"
              << location.line() << " "
              << location.function_name() << " "
              << message << '\n';
}

int main() 
{
    log("Hello, World!");
    return 0;
}

在这个例子中,log函数会输出消息以及调用它的源代码位置。

std::source_location 是在 C++20 标准中引入的。目前,GCC 11 和更新版本的 GCC 支持 std::source_location

在 Ubuntu 上,你可以使用以下命令来安装或更新到最新的 GCC 版本:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-11 g++-11

安装或更新 GCC 后,你可以使用 -std=c++20-std=gnu++20 选项来启用 C++20 支持:

g++-11 -std=c++20 your_file.cpp

注意,虽然 GCC 11 支持 C++20,但某些特性可能仍然存在问题或尚未完全实现。具体情况请参考 GCC 官方文档。

如何在 Ubuntu 上安装或更新 g++。以下是如何进行的一些指导:

g++ --version
  1. 打开终端。
  2. 首先,您可以通过运行以下命令来检查您当前的 g++ 版本:
    g++ --version

  3. 如果您要安装 g++,可以运行以下命令:
    sudo apt-get install g++

  4. 如果您要更新 g++,您可以首先添加 Ubuntu 工具链测试库,然后安装新的 g++ 版本。例如,如果您要安装 g+±11,可以运行以下命令:
    sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    sudo apt-get update
    sudo apt-get install g++-11

  5. 安装新版本的 g++ 后,您可以使用 update-alternatives 来配置默认的 g++ 版本。例如,如果您有 g+±9 和 g+±11,您可以运行以下命令来设置 g+±11 为默认版本:
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 20
sudo update-alternatives --config g++

--config 命令中,您将看到一个列表,您可以从中选择默认的 g++ 版本。

如果要在Ubuntu中降级安装特定版本的g++,可以按照以下步骤进行:

  1. 首先,打开终端。

  2. 输入以下命令查看系统上的所有可用版本:

    apt-cache show gcc | grep Version

  3. 从列表中选择你需要的版本。

  4. 输入以下命令删除当前的g++版本:

    sudo apt-get remove g++

  5. 输入以下命令安装你需要的版本,例如安装g+±7:

    sudo apt-get install g++-7

  6. 然后你可以通过以下命令设置系统默认的g++版本:

    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 60

    这个命令的意思是在/usr/bin/g++/usr/bin/g++-7之间建立一个链接,60是优先级,数字越大优先级越高。

  7. 如果你有多个版本的g++,你可以使用以下命令切换版本:

sudo update-alternatives --config g++

然后根据提示选择你需要的版本。

注意:降级安装可能会导致某些依赖于更高版本g++的程序或库无法正确运行。

 

相关推荐

  1. C++】C++栈介绍区别

    2024-03-20 16:40:04       27 阅读
  2. C++指针、引用数组

    2024-03-20 16:40:04       49 阅读
  3. C++ typedef using

    2024-03-20 16:40:04       50 阅读
  4. C# List<int> int[] ?

    2024-03-20 16:40:04       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-20 16:40:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-20 16:40:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-20 16:40:04       87 阅读
  4. Python语言-面向对象

    2024-03-20 16:40:04       96 阅读

热门阅读

  1. AI自动绘画生成器,AI自动绘画工具使用教程

    2024-03-20 16:40:04       65 阅读
  2. 国内外主流 TOF 相机品牌与参数

    2024-03-20 16:40:04       68 阅读
  3. 【Python 48小时速成 4】注释

    2024-03-20 16:40:04       38 阅读
  4. C qsort 与 C++ sort 函数

    2024-03-20 16:40:04       49 阅读
  5. 【Python 48小时速成 3】输入与输出

    2024-03-20 16:40:04       44 阅读
  6. 用python实现视频异常检测

    2024-03-20 16:40:04       44 阅读
  7. jvm 堆

    2024-03-20 16:40:04       36 阅读