这是什么C++语言结构:#(即哈希)整数"path_to_header_or_cpp_file"<integer>?

What is this C++ language construct: # (i.e. hash) integer "path_to_header_or_cpp_file" <integer>?

本文关键字:file cpp or header C++ lt gt integer 是什么 to 语言      更新时间:2023-10-16

我在.cpp文件中遇到了以下代码。我不明白涉及头文件的结构或语法。我确实认识到这些特定的头文件与Android NDK有关。但是,我认为这个问题是关于C++语法的一般问题。这些似乎在某种程度上是预处理器命令,因为它们以"#"开头。但是,它们不是典型的 #include、#pragma、#ifndef、#define 等命令。源文件有更多的 1000+ 这样的实例引用数百个不同的 .h、.c .cpp文件。

typedef int __time_t;
typedef int __timer_t;
# 116 "/home/usr/download/android-ndk-r8b/platforms/android-3/arch-arm/usr/include/machine/_types.h"
# 41 "/home/usr/download/android-ndk-r8b/platforms/android-3/arch-arm/usr/include/sys/_types.h" 2
# 33 "/home/usr/download/android-ndk-r8b/platforms/android-3/arch-arm/usr/include/stdint.h" 2
# 48 "/home/usr/download/android-ndk-r8b/platforms/android-3/arch-arm/usr/include/stdint.h"
typedef __int8_t int8_t;
typedef __uint8_t uint8_t;

编译器 (GCC) 似乎没有抛出与这些行相关的任何错误。但是,我想了解它们的目的和功能。谁能解释这些?

这是

GCC预处理器的输出。这些行称为线条标记。它们具有以下语法:

# linenum filename flags

它们被解释为说以下行来自linenum行来自filename。它们基本上只是帮助您和编译器查看包含行的位置。这些标志提供了更多信息:

  • 1 - 这表示新文件的开始。
  • 2 - 这表示返回到一个文件(在包含另一个文件之后)。
  • 3 - 这表示以下文本来自系统头文件,因此应禁止显示某些警告。
  • 4 - 这表示应将以下文本视为包含在隐式extern "C"块中。

如果将 -E 标志提供给 g++,则可以通过预处理自己的程序看到此输出。

您通常会在预处理器的输出中看到类似的行(即,您通常根本不应该看到它们)。

它们类似于标准#line指令,其形式为:

#line 42

#line 42 "foo.c"

编译器使用它来控制错误消息的内容。

没有line这个词,这个:

# 42 "foo.c"

从技术上讲,它是一种指令(只是为了增加乐趣,它是一种指令)。就C标准而言,它本质上是一个评论。猜测,gcc 的预处理器可能会发出这些指令而不是#line指令#line因为指令旨在作为预处理器的输入

GCC 的预处理器将这些称为"行标记";它们在 CPP 手册中进行了讨论。它们被视为#line指令,只是它们可以采用额外的标志参数。

预处理器倾向于引入这些指令并使用它们来指示行和文件名。C++没有定义含义,但它保留了使用

# <non-directive>

哪里不是正常指令之一的东西。编译器写入似乎已同意在这些中使用行号和文件名作为预处理文件的结果。这种用法基本上类似于所有支持 -E 选项的编译器,以指示只应处理文件。