首页 > 解决方案 > c 语言 gcc 编译器 *.i 文件 #3 "" 2 这是什么?

问题描述

//main.c
#include <stdio.h>
#include "swap.h"

int main(void){
    return 0;
}

.

//swap.h
void swap(int* a, int* b){
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

我想知道预处理器如何在编译器中工作。

所以我开始从预处理器分析。

我尝试在终端中进行预处理。

gcc -E  c.c -o c.i

在这段代码中。

我有一个问题。

# 2 "c.c" 2
# 1 "swap.h" 1

# 1 "swap.h"
void swap(int* a, int* b){
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
# 3 "c.c" 2

extern void hello(void);

int main(void){
    return 0;
}

在这段代码中。

# 2 "c.c" 2
# 1 "swap.h" 1
# 3 "c.c" 2

这段代码是什么意思?

换句话说,# 和数字是什么意思?

.c”和“ .h”是什么意思?

标签: ccompilation

解决方案


这些指令指示输出中特定代码行的来源。

前两个字段是从该点开始的原始文件的行号和源文件名。之后的任何数字都是标志

从关于预处理器输出的GCC 文档中:

源文件名和行号信息由表格的行传达

# linenum filename flags

这些被称为线标记。它们根据需要插入到输出中(但从不在字符串或字符常量中)。他们的意思是以下行起源于 linenum 处的文件文件名。文件名永远不会包含任何非打印字符;它们被八进制转义序列替换。

文件名后面有零个或多个标志,它们是“1”、“2”、“3”或“4”。如果有多个标志,则用空格分隔它们。以下是标志的含义:

'1' 这表示一个新文件的开始。

'2' 这表示返回到一个文件(在包含另一个文件之后)。

'3' 这表示以下文本来自系统头文件,因此应禁止某些警告。

'4' 这表示以下文本应被视为包含在隐式 extern "C" 块中。


推荐阅读