IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux C语言 宏函数展开测试(复合语句表达式 ({})) -> 正文阅读

[系统运维]linux C语言 宏函数展开测试(复合语句表达式 ({}))

测试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 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 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 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 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 u\n");

	return 0;
}

预处理:

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



int main(){
 printf("I miss u\n");

 return 0;
}

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

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

ubuntu上

测试1

#pragma warning(disable : 4996)
#include <stdio.h>
#include <stdlib.h> 


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

ubuntu上

测试2

#pragma warning(disable : 4996)
#include <stdio.h>
#include <stdlib.h> 


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

测试宏函数(visual studio vc 无法使用复合语句表达式 ({}))

ubuntu上

//#pragma warning(disable : 4996)
#include <stdio.h>
#include <stdlib.h> 

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

int main() {
    printf("%u\n", PLUS);
	return 0;
}

在这里插入图片描述
vs上代码检查就报错了,啥情况呢?
在这里插入图片描述

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

上面的语法其实是gnu的复合语句表达式
在这里插入图片描述

语法规则

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

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

//#pragma warning(disable : 4996)
#include <stdio.h>
#include <stdlib.h> 

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

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

比较复杂的宏语句,以后再更。。。

参考文章

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

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:43:29  更:2022-05-12 16:45:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:36:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码