c语言程序环境和预处理

test.c(源文件) --> 编译器 --> test.obj(目标文件,在debug里)
链接库和多个目标文件 经过 链接器的处理,最终生成可执行程序.exe

编译阶段

预处理/预编译阶段 :1.头文件的包含 2.define定义符号的替换,并删除定义的符号 3.删除注释 这三个都是文本操作
编译:把C语言代码转换成汇编代码
汇编:把汇编代码转换成二进制指令,形成符号表

链接阶段

合并段表
符号表的合并和重定位

预处理

__ FILE__进行编译源文件的位置
__ LINE__文件当前的行号
__ DATE__文件被编译的日期
__ TIME__文件被编译的时间
在这里插入图片描述

__ STDC__判断编译器是否服从标准C(ANSI C)数值就是1,否则就是没有定义这个内置符号
可以看出vs不遵循此标准
在这里插入图片描述
大多数oj网站使用gcc或者clang编译器

define定义标识符

后面加上“;”是一种非常坑爹的行为
#define MAX 1000
#define STR “hello world”

#define定义宏

对于宏不能递归

#define SQUARE(x) x*x
int main()
{
	int r = SQUARE(5);
	printf("%d ", r);  //25


	return 0;
}

为了避免以下情况发生

#define SQUARE(x) x*x
int main()
{
	int r = SQUARE(5+1);
	// r = 5 + 1*5 + 1 
	printf("%d ", r);  //11


	return 0;
}

可以define成

#define SQUARE(x) ((x)*(x))


#define PRINT(N,FORMAT) printf("the value of " #N " is "FORMAT"\n",N)  //#会把参数对应的转换成字符串
int main()
{
	int  a = 10;
	PRINT(a,"%d");  //the value of a is 10

	double b = 3.14;
	PRINT(b, "%lf");  //the value of b is 3.140000
	return 0;
}

// ##可以把位于它两边的符号合成一个符号

#define CAT(Class,Num) Class##Num
int main()
{
	int class106 = 100;
	printf("%d", CAT(class, 106)); //100
	return 0;
}



#define M 100
int main()
{
	int a = M;
#undef M

	return 0;
}



//offsetof宏模拟实现
struct s
{
	char c1;
	int i;
	char c2;
};

#define OFFSETOF(type,m_name)  (size_t)&(((type*)0)->m_name)
int main()
{
	struct s s = { 0 };

	printf("%d\n", offsetof(struct s, c1)); //0
	printf("%d\n", offsetof(struct s, i));  //4
	printf("%d\n", offsetof(struct s, c2)); //8

	printf("%d\n", OFFSETOF(struct s, c1)); //0
	printf("%d\n", OFFSETOF(struct s, i));  //4
	printf("%d\n", OFFSETOF(struct s, c2)); //8

	return 0;
}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 20:14:01       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 20:14:01       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 20:14:01       62 阅读
  4. Python语言-面向对象

    2024-07-18 20:14:01       72 阅读

热门阅读

  1. 2.设计模式--创建者模式--单例设计模式

    2024-07-18 20:14:01       20 阅读
  2. 编程中的智慧之设计模式二

    2024-07-18 20:14:01       23 阅读
  3. 轻松掌握PyTorch CUDA编程,机器学习如虎添翼

    2024-07-18 20:14:01       23 阅读
  4. 【无标题】Elasticsearch for windows

    2024-07-18 20:14:01       23 阅读
  5. 数据仓库实践:了解和定义指标

    2024-07-18 20:14:01       22 阅读
  6. 互联网摸鱼日报(2024-07-18)

    2024-07-18 20:14:01       23 阅读
  7. 【Unity】RPG2D龙城纷争(十三)升级系统

    2024-07-18 20:14:01       27 阅读
  8. 使用 GO 和 Python 分别写爬虫的区别

    2024-07-18 20:14:01       21 阅读
  9. 数据库系统概论:数据库查询语言 SQL

    2024-07-18 20:14:01       22 阅读
  10. 017.自定义指纹浏览器-传参固定指纹(二)

    2024-07-18 20:14:01       18 阅读