程序的编译(下)

本文详细介绍了C语言中的预处理指令,包括预定义符号如__func__,__FILE__,__LINE__,__DATE__,__TIME__的使用,以及#define宏定义的两种形式和注意事项。还探讨了宏与函数的优缺点,并展示了条件编译#if, #elif, #else, #endif的用法,帮助读者理解预处理在程序开发中的作用。

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

3.预处理详解

3.1预定义符号:

__func__, __FILE__, __LINE__, __DATE__, __TIME__

int main()
{
	int i = 0;
	FILE* pf = fopen("log.txt", "w");
	if (pf == NULL)
	{
		return 1;
	}
	for (i = 0; i < 10; i++)
	{
		fprintf(pf,"name:%s file:%s line:%d date:%s time:%s i=%d\n", __func__, __FILE__, __LINE__, __DATE__, __TIME__, i);
	}
	fclose(pf);
	pf = NULL;
}

打开对应路径下的文件,就可以发现

此外,__stdc__//如果编译器遵循ansi c,其值为1,否则未定义

3.2#define

1.定义标识符常量

例如:

#define NUM 100
#define STR "abcdef"
int main()
{
	int num = NUM;
	char* str = STR;
}

或者

#define reg register
int main()
{
	int reg num = 100;
}

2.定义宏:#define允许把参数替换到文本中,这种现象通常称为宏

宏的声明方式:#define name(parament-list) stuff

#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
	int a = 10;
	int b = 20;
	int c = MAX(a, b);
	printf("%d\n", c);
}

或者

#define SQUARE(x) ((x)*(x))
int main()
{
	int a = 9;
	int r = SQUARE(a + 1);
	printf("%d\n", r);
}

注意:

1.宏的定义末尾不能出现;

2.参数列表的左括号必须与name紧邻

3.不要吝啬括号

3.#define替换规则

 4.宏和函数对比

宏通常被应用于执行简单的运算,比如刚才所写的找出两个数较大的一个

优点:此时,宏比函数在程序的规模和速度上更胜一筹,且宏是类型无关的。

缺点:宏无法调试;如果宏比较长,会大幅度增加程序的长度;宏可能会带来运算符优先级的问题

5.条件编译

常见的条件编译指令:

1.#if  #endif

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		arr[i] = i + 1;
#if 1
		printf("%d ", arr[i]);
#endif
	}
}

 2.#if #elif #else #endif

#define NUM 2
int main()
{
#if NUM==1
	printf("hehe\n");
#elif NUM==2
	printf("haha\n");
#else
	printf("heihei\n");
#endif
}

3.#ifdef #endif

#define MAX 0
int main()
{
//#if defined(MAX)
//	printf("hehe\n");
//#endif
#ifdef MAX
	printf("hehe\n");
#endif
}
//判断宏是否被定义了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值