1-C语言拾遗(1):机制

本文探讨了C语言中`#include`指令的使用,`< >`与`" "`的区别以及GCC的`-I`选项如何影响头文件搜索路径。预编译主要作用是展开`#include`的头文件,用于函数声明,而不是函数定义。通过示例展示了如何使用`-I`选项,并解释了C语言中一切皆可取地址的概念,强调在汇编视角下程序执行的本质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
#include < >是从系统目录去找
#include " "是从当前目录去找
gcc的-I选项可以把某些文件加入到系统目录中
如gcc a.c -I. 就可以把当前目录的所有文件加入到系统目录中,这样就可以用<>了


在这里插入图片描述
在这里插入图片描述
把原来的include <stdio.h>变成
extern int printf (const char *__restrict __format, ...);

extern int printf (const char *__restrict __format, ...);

int main(){
#if aa == bb
        printf("Yes\n");
#else
        printf("No\n");
#endif

}

重新运行,得到同样的结果。
表明预编译的作用仅仅就是展开#include的头文件,用来对所有的函数进行声明,头文件里的内容没有函数的定义,仅仅是函数的声明。
在这里插入图片描述
-E是进行预编译操作,可以看到将所有的带#的代码都去掉了,用新的代码替代。

extern int printf (const char *__restrict __format, ...);

int main(){
#ifdef __x86_64__
	printf("x86-64\n");
#else
	printf("x86\n");
#endif



#if aa == bb
	printf("Yes\n");
#else
	printf("No\n");
#endif

}     

在这里插入图片描述
在这里插入图片描述

为什么aa=bb成立?
由上可见,#ifdef#if后面跟着的那个字符串,区分为定义了的字符串和没定义的字符串,由于aa和bb都是没有被定义的,所以空=空
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
a.c

int foo(int n){
	int sum = 0;
	for (int i=1;i<n;i++){
		sum += 1;
	}
	return sum;
}

b.c

int foo(int);

int main() {
	printf("%d\n",foo(100));
}

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
C语言中一切皆可取地址,包括代码,数据,堆栈。在汇编语言的视野里,所有东西都是地址。整个程序所做的事就是一个状态机,所作的唯一的事就是指令从内存中读取内容,存到寄存器,算一下再写到内存
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值