C语言gcc编译器 *.i文件#3“ 2” 2这是什么?

问题描述 投票:0回答:1
//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”是什么意思?

这些指令表示输出中代码的偏瘫线的起源。

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

从预处理器输出上的GCC文档

c gcc compilation
1个回答
3
投票
Source文件名和行号信息由行传达 形式

# linenum filename flags

这些被称为线条标记。他们根据需要插入 输出(但从不在字符串或字符常数中)。他们的意思是 以下行起源于Line Linenum的文件文件名。 文件名将永远不会包含任何非打印字符;他们是 用八进制序列取代。

文件名发生在零或更多标志之后,即“ 1”,“ 2”,“ 3”, 或“ 4”。如果有多个标志,则将空间分开。这是 旗帜是什么意思:

’1’ 这表示新文件的开始。 ’2’ 这表明返回文件(包含另一个文件后)。

’3’ 这表明以下文本来自系统标头文件,因此应抑制某些警告。
’4’ 这表明应将以下文本视为包裹在隐式外部“ C”块中。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.