ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言其他补充(59)

2022-03-20 12:33:07  阅读:172  来源: 互联网

标签:__ 59 补充 C语言 int printf return include define


#运算符 利用宏创建字符串

将替换符 字符串化,解决字符串中,不可被替换的参数问题。
字符串如下的书写也是合理的。

char buf[] = "china ""is ""great";

代码演示:

#include <stdio.h>
int main()
{
	char buf[] = "china ""is ""great";
	printf("%s\n", buf);
	return 0;
}

运行结果为:
运行结果
我们可以看到,上面的形式多个字符串连在一起可以看作是一个字符串。

代码演示:

#include <stdio.h>

#define str(x) x
int main()
{
	printf("%d\n", str(1));
	return 0;
}

运行结果为:
运行结果
代码演示:

#include <stdio.h>

#define str(x) x
int main()
{
	printf("%s\n", str("abc"));
	return 0;
}

运行结果为:
运行结果

代码演示:

#include <stdio.h>

#define str(x) "aaa"x"bbb"
int main()
{
	printf("%s\n", str("voctory"));
	return 0;
}

运行结果为
运行结果

代码演示:

#include <stdio.h>

#define str(x) "aaa"#x"bbb"
int main()
{
	printf("%s\n", str(112233));
	return 0;
}

运行结果为:
运行结果
我们可以看到上面的代码把传入的数值字符串化。

代码演示:

#include <stdio.h>

#define str(x) "aaa"#x"bbb"
int main()
{
	printf("%s\n", str(victory));
	return 0;
}

运行结果为:
运行结果

案例分析:定义一个宏打印一个数据的平方。
代码演示:

#include <stdio.h>

#define str(x) "aaa"#x"bbb"

#define printSqr(x) printf("sqr("#x") = %d\n",x*x)
int main()
{
	printSqr(5);
	return 0;
}

运行结果为:
运行结果

##运算符 预处理的粘和剂

我们之前写过这样的代码:
代码演示:

#include <stdio.h>

#define S(a,b) a+b

int main()
{
	printf("%d\n", S(1, 2));
	return 0;
}

运行结果为:
运行结果

代码演示:

#include <stdio.h>

#define S(a,b) a+a+b+b

int main()
{
	printf("%d\n", S(6, 6));
	return 0;
}

运行结果为:
运行结果

但是如果有一天,想实现aa + bb

代码演示:

#include <stdio.h>

#define S(a,b) a##a+b##b

int main()
{
	printf("%d\n", S(1, 2));
	return 0;
}

运行结果为:
运行结果
代码演示:

#include <stdio.h>

#define S(a,b) a##a+b##b

int main()
{
	printf("%d\n", S(6, 6));
	return 0;
}

运行结果为:
运行结果

代码演示:

#include <stdio.h>

#define X(n) x##n

int main()
{
	int X(1) = 10;
	int X(2) = 20;
	printf("x1 = %d\tx2 = %d\n", x1, x2);

	return 0;
}

运行结果为:
运行结果

综合:
#解决了双引号中无法替换问题,##解决了非双引号中粘连无法替换的问题。

代码演示:

#include <stdio.h>
#define XNAME(n) x##n
#define PRINT_XN(n)printf("x"#n" = %d\n",x##n)

int main()
{
	int XNAME(1) = 14;
	int XNAME(2) = 20;
	printf("x1 = %d\nx2 = %d\n", x1, x2);
	PRINT_XN(1);		//隐藏了变量的声明和使用
	PRINT_XN(2);
	return 0;
}

运行结果为:
运行结果

系统提供的预定义宏

系统提供的预定义宏,我们只能使用,不能修改。

__DATE__
进行预处理的日期("MMmm dd yyyy"形式的字符串文字)
__FILE__代表当前源代码文件名的字符串文字
__LINE__ 代表当前源代码中的行号的整数常量
__TIME__ 源文件编译时间,格式"hh:mm:ss"
__func__ 当前所在函数名

在打印调试信息时打印这两个宏 
__FILE__
__LINE__ 
可以给开发者非常有用的提示

代码演示:

#include <stdio.h>
#include <stdlib.h>
void why_me();
int main()
{
	printf("The file is%s.\n", __FILE__);
	// _ _
	printf("The date is %s.\n", __DATE__);
	printf("The time is %s.\n", __TIME__);
	printf("This is line %d.\n", __LINE__);
	printf("This function is %s.\n", __func__);
	why_me();
	return 0;
}
void why_me()
{
	printf("This function is %s\n", __func__);
	printf("The file is %s.\n", __FILE__);
	printf("This is line %d.\n", __LINE__);
}

运行结果为:
运行结果

在打印日志的时候,这些系统提供的预定义宏非常有用,但是现在更多的是被debug替代。

我们可以沿着日志进行分析来大概锁定日志中断的位置去分析程序崩溃的位置。
因为程序崩溃就不再写日志了。

标签:__,59,补充,C语言,int,printf,return,include,define
来源: https://blog.csdn.net/qq_43648751/article/details/107358430

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有