c - 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”是什么意思?
解决方案
这些指令指示输出中特定代码行的来源。
前两个字段是从该点开始的原始文件的行号和源文件名。之后的任何数字都是标志
从关于预处理器输出的GCC 文档中:
源文件名和行号信息由表格的行传达
# linenum filename flags
这些被称为线标记。它们根据需要插入到输出中(但从不在字符串或字符常量中)。他们的意思是以下行起源于 linenum 处的文件文件名。文件名永远不会包含任何非打印字符;它们被八进制转义序列替换。
文件名后面有零个或多个标志,它们是“1”、“2”、“3”或“4”。如果有多个标志,则用空格分隔它们。以下是标志的含义:
'1' 这表示一个新文件的开始。
'2' 这表示返回到一个文件(在包含另一个文件之后)。
'3' 这表示以下文本来自系统头文件,因此应禁止某些警告。
'4' 这表示以下文本应被视为包含在隐式 extern "C" 块中。
推荐阅读
- android - 电子邮件的共享首选项
- sql-server - sqlcmd 的 SQL Server 登录问题
- python - 并排的两个具有不同比例的条形图
- typescript - 打字稿发出的声明找不到全局接口的名称
- php - 如何将div值输入数据库
- symfony - 在持久化数据之后和刷新数据之前触发 UniqueEntity
- python - 在 Python 中创建关于特定人的爱好的字典名称:[hobby_1, hobby_2]
- caching - PageSpeed Insights 错误地报告缓存策略?
- c# - REGEX 非连续匹配字符串
- sql-server - 访问列表框第二项不显示