这个C ++语言构造是什么:#(即哈希)整数“path_to_header_or_cpp_file”<integer>?</integer>

时间:2013-12-27 18:38:08

标签: c++ gcc syntax header-files

我在.cpp文件中遇到了以下代码。我不理解涉及头文件的构造或语法。我确实认识到这些特定的头文件与Android NDK有关。但是,我认为这个问题是关于C ++语法的一般性问题。 这些似乎是以某种方式的预处理器命令,因为它们以“#”开头。但是,它们不是典型的#include,#pragma,#ifnf,#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)似乎没有抛出与这些行相关的任何错误。但是,我想了解他们的目的和功能。任何人都可以解释这些吗?

3 个答案:

答案 0 :(得分:18)

这是GCC预处理器的输出。这些行称为linemarkers。他们有语法:

# linenum filename flags

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

  
      
  • filename - 这表示新文件的开始。
  •   
  • 1 - 表示返回文件(包含其他文件后)。
  •   
  • 2 - 这表示以下文本来自系统头文件,因此应禁止某些警告。
  •   
  • 3 - 这表示以下文本应被视为包含在隐式4块中。
  •   

如果将extern "C"标志赋予g ++,则可以预先处理自己的程序。

答案 1 :(得分:2)

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

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

#line 42

#line 42 "foo.c"

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

没有单词line,这个:

# 42 "foo.c"

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

gcc的预处理器将这些称为“线性标记”;他们被讨论in the cpp manual。它们被视为#line指令,除了它们可以采用额外的标志参数。

答案 2 :(得分:1)

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

的用法
# <non-directive>

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