栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

linux C语言 宏函数展开测试(复合语句表达式 ({}))

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux C语言 宏函数展开测试(复合语句表达式 ({}))

文章目录
    • 测试1(测试简单的宏展开)
    • 测试2(测试简单的宏替换)
    • 来看两个花括号测试(花括号能隔离环境)
      • 测试1
      • 测试2
    • 测试宏函数(visual studio vc 无法使用复合语句表达式 ({}))
    • C语言复合语句表达式 ({}) (只适用于gnu)
      • 语法规则
      • 示例1(在复合表达式中定义函数,调用函数,判断语句,以最后一个语句的值作为返回)
    • 比较复杂的宏语句,以后再更。。。
    • 参考文章

测试1(测试简单的宏展开)

ubuntu上
如:
test.c

#define KY_GET_CURRENT_TIME (time)

int main(){
	KY_GET_CURRENT_TIME(NULL);

	return 0;
}

预处理:

[root@ubuntu /arnold_test/20220509_compile_preprocessing_test]3# gcc -E test.c 
# 1 "test.c"
# 1 ""
# 1 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "" 2
# 1 "test.c"

int main(){
 (time)(NULL);

 return 0;
}

或:

[root@ubuntu /arnold_test/20220509_compile_preprocessing_test]4# gcc -E test.c -o test.i
[root@ubuntu /arnold_test/20220509_compile_preprocessing_test]5# 
[root@ubuntu /arnold_test/20220509_compile_preprocessing_test]5# 
[root@ubuntu /arnold_test/20220509_compile_preprocessing_test]5# cat test.i 
# 1 "test.c"
# 1 ""
# 1 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "" 2
# 1 "test.c"
int main(){
 (time)(NULL);

 return 0;
}
[root@ubuntu /arnold_test/20220509_compile_preprocessing_test]6# 
测试2(测试简单的宏替换)

ubuntu上

#define KY_print printf

int main(){
	KY_print("I miss un");

	return 0;
}

预处理:

[root@ubuntu /arnold_test/20220509_compile_preprocessing_test]8# gcc -E test.c 
# 1 "test.c"
# 1 ""
# 1 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "" 2
# 1 "test.c"



int main(){
 printf("I miss un");

 return 0;
}

来看两个花括号测试(花括号能隔离环境)

参考文章:c语言加花括号的原则

ubuntu上

测试1
#pragma warning(disable : 4996)
#include 
#include  


int main() {
	int a = 1;
	{
		int a = 2;
		printf("%dn", a);	//2
	}
	printf("%dn", a);	//1
	return 0;
}

ubuntu上

测试2
#pragma warning(disable : 4996)
#include 
#include  


int main() {
	int a = 1;
	{
		a = 2;
		printf("%dn", a);	//2
	}
	printf("%dn", a);	//2
	return 0;
}
测试宏函数(visual studio vc 无法使用复合语句表达式 ({}))

ubuntu上

//#pragma warning(disable : 4996)
#include 
#include  

#define PLUS 
({int a = 1;
int b =2;
(a+b);})

int main() {
    printf("%un", PLUS);
	return 0;
}


vs上代码检查就报错了,啥情况呢?

C语言复合语句表达式 ({}) (只适用于gnu)

上面的语法其实是gnu的复合语句表达式

语法规则

1、⼀对圆括号在外边,⼀对⼤括号在⾥⾯。
2、复合语句可以有函数调⽤、变量赋值
3、最后⼀条语句必须以分号结尾。
4、最后⼀条语句的值,将作为整个表达式的值
5、如果你在⼤括号⾥的最后⼀句⽤的是没有返回值的语句,则整个表达式的返回类型为 void,即没有合法的返回值
参考文章:C语言的复合语句表达式

示例1(在复合表达式中定义函数,调用函数,判断语句,以最后一个语句的值作为返回)
//#pragma warning(disable : 4996)
#include 
#include  

int main() {
	int a = ({
			int foo()
			{
				return 10;
			}
			int y =foo();
			int z;
			if(y > 0)
				z = y;
			else
				z =-y;
			z;
		});
	printf("%dn", a);
	return 0;
}

同样,猜测({})也能隔绝环境,没测试哈。。。

比较复杂的宏语句,以后再更。。。 参考文章

参考文章:C语言(复合语句表达式)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/882625.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号