Echarts散点图(火山图)自定义配置

  1. 创建DOM元素

    <div><div ref="chat" :style="{width: volcanoDimensions.width,height: volcanoDimensions.height,}" class="chat"></div></div>
    
  2. 初始化图表

    在这里插入图片描述

    需要实现,被筛选出的数据,带有label,labelLayout,labelLine,原定是直接在series的三组数据中,直接给出三者的相关配置:

    label: {show: true,formatter: function (param) {// 仅为目标点显示标签const specialPoints = ["a", "b"];if (specialPoints.includes(param.value[2])) {return param.value[2];}return "";},position: 'left',minMargin: 2
    },
    labelLine:{show: true
    },
    labelLayout: function (labelInfo) {// 从后端获取的匹配字段,当前给定['a','b']const specialPoints = ["a", "b"];if (specialPoints.includes(labelInfo.text)) {return {x: myChart.getWidth() - 500,moveOverlap: 'shiftY'};}return ""; // 非特定点不应用布局
    },
    

    目的是为了匹配后端返回的过滤数据,给出对应label和labelLine,如果当前点符合,才显示对应标签;但是页面显示label的时候:

    在这里插入图片描述

    未匹配的点周围也会显示label,只是很短。尝试给labelLine加上条件判断,返回bool值。但是并没有起作用。

    label : {show: function (param) {// 仅为目标点显示标签线const specialPoints = ["a", "b"];return specialPoints.includes(param.value[2]);},
    }
    

    最后只能通过,筛选匹配数据,根据name往series里面push两组新数据作为额外两组数据,单独显示label

    如果是饼图,这种series里面只有一组数据,单独配置的话:

    直接通过遍历里面的数据,单独添加labellabelLine属性会更方便,两种方法均可行

    let label = {show:true,fontSize:14,color:'#000'
    }
    let labelLine = {show: true,lineStyle:{color: '#000'}
    }
    series.data.forEach((item,index)=>{const testArr = ['a','b','c']if(testArr.includes(item.value)){item['label'] = labelitem['labelLine'] = labelLine}
    })
    
    data() {return {myChart: this.$refs.chat,// 默认初始配置volcanoChartOptions:{}};
    },mounted() {// 先初始化,之后从接口访问这个series数据// 理论上,所有的图表数据都应该是后端返回this.initChat();// 从接口返回图表配置数据this.loadvolcanoChartOptions();
    },methods:{initChat() {// 只能写从后端获取数据的时候,往series后面重新push一个新的对象,// 然后这个对象的其余配置都和对应name保持一致,但是label的显示隐藏不一致if (!this.myChart) {this.myChart = this.echarts.init(this.$refs.chat);}},// 加载后端数据async loadvolcanoChartOptions(){try{// 假设从接口模拟const response = await this.fetchvolcanoChartOptions()// console.log(response.data,"----");this.volcanoChartOptions = response.data// 将数据更新到vuex中this.updateVolcanoOptions(response.data)this.volcanoChartOptions && this.myChart.setOption(this.volcanoChartOptions);}catch(e){console.log("加载图表配置失败",e);}},// 创建接口,模拟从后端返回数据async fetchvolcanoChartOptions() {// 在这里替换成实际的 API 调用return new Promise((resolve) => {setTimeout(() => {resolve({data: {title: {text:'火山图',left: 'center',textStyle:{fontFamily: 'Arial',fontSize: 18,color:'rgba(0,0,0, 1)'}},grid: {left: '3%',right: '7%',bottom: '7%',containLabel: true,},tooltip: {// trigger: 'axis',showDelay: 0,formatter: function (params) {if (params.value.length > 1) {return ('X: ' + params.value[0] +'<br/>' +'Y: ' + params.value[1] +'<br/>' +'geneId: ' + params.value[2]);}},axisPointer: {show: true,type: 'cross',lineStyle: {type: 'dashed',width: 1}}},legend: {data: ['Up', 'Down', 'Nodiff'],right: '10%',top: '20%',orient: 'vertical',// 给图例的原点点加了个边框// itemStyle:{//   borderWidth:1,//   borderColor:'black'// }},xAxis: {type: 'value',scale: true,axisLabel: {formatter: '{value}',fontSize: 12,fontFamily: 'Arial',color: 'rgba(0,0,0, 1)',},splitLine: {show: false},min:'-25',max:'10',nameLocation:'middle',name:'x轴标题',nameGap: 30,  // 设置标题与轴的间隔nameTextStyle: { fontFamily: 'Arial', fontSize: 16,color: 'rgba(0,0,0, 1)',},},yAxis: {type: 'value',scale: false,axisLabel: {formatter: '{value}',fontSize: 12,fontFamily: 'Arial',color: 'rgba(0,0,0, 1)',},// 是否展示横线,每个刻度的横线splitLine: {show: false},min:'-5',max:'35',nameLocation:'middle',name:'y轴标题',nameGap: 30,  // 设置标题与轴的间隔nameTextStyle: { fontFamily: 'Arial', fontSize: 16,color: 'rgba(0,0,0, 1)',},},series:[{name: 'Nodiff',color: 'rgba(192,192,192, 1)',type: 'scatter',symbolSize:5, // 标记点的大小emphasis: {focus: 'series'},data: [[-0.8,8.2,"ENSMUSG00000030342"],[-0.7,8.1,"ENSMUSG00000004633"],[-0.9,7.6,"ENSMUSG00000074802"],],markLine: {lineStyle: {type: 'solid'},}},{name: 'Up',color: 'rgba(255, 51, 51,1)',type: 'scatter',symbolSize:5, // 标记点的大小emphasis: {focus: 'series'},// prettier-ignoredata: [[1.262,4.1255,"a"],[3.8047,3.5476,"b"],[1.2933,3.1948,"c"],[1.6687,2.7994,"ENSMUSG00000084844"],[7.1892,2.7479,"ENSMUSG00000000394"],[1.0471,2.6834,"ENSMUSG00000084904"],[1.835,2.5167,"ENSMUSG00000028707"],[1.1921,2.333,"ENSMUSG00000086502"],[1.1156,2.3094,"ENSMUSG00000028125"],[4.3545,2.2873,"ENSMUSG00000107313"],],markLine: {silent: true,symbol: 'none', // 去掉箭头data: [// label label: {color: '#FF1D00',formatter:'',fontSize:10} formatter里面写echart横线竖线的标注{ xAxis: 'min', lineStyle: { color: '#2f2f2f' }, label: { color: '#FF1D00', formatter: '', fontSize: 10 } },{ yAxis: 'min', lineStyle: { color: '#2f2f2f' }, label: { color: '#FF7804', formatter: '', fontSize: 10 } }]}},{name: 'Down',color: 'rgba(51, 51, 255, 1)',type: 'scatter',symbolSize:5, // 标记点的大小emphasis: {focus: 'series'},// prettier-ignoredata: [[-3.445,29.9859,"a"],[-1.418,25.7115,"b"],[-1.489,25.1274,"c"],[-3.445,29.9859,"a"],[-1.418,25.7115,"b"],[-1.489,25.1274,"c"],[-3.28,23.0754,"ENSMUSG00000056071"],[-1.999,19.1505,"ENSMUSG00000001741"],[-3.1,18.2834,"ENSMUSG00000056054"],[-1.649,16.959,"ENSMUSG00000025154"],[-2.92,16.3029,"ENSMUSG00000020264"],[-2.652,11.7498,"ENSMUSG00000037868"],[-4.807,10.8801,"ENSMUSG00000040380"],],markLine: {silent: true,symbol: 'none', // 去掉箭头data: [// label label: {color: '#FF1D00',formatter:'',fontSize:10} formatter里面写echart横线竖线的标注{ xAxis: 'max', lineStyle: { color: '#2f2f2f' }, label: { color: '#FF1D00', formatter: '', fontSize: 10 } }]}},// push的数组,加上光圈的两组数据,即为筛选后的数据{name: 'Down',color: 'rgba(51, 51, 255, 1)',type: 'effectScatter',  //加上光圈效果,如果做切换,scatter就是纯点symbolSize:6,  //光圈大小emphasis: {focus: 'series'},label: {show: true,formatter: function (param) {return param.value[2]; // 显示 geneId},position: 'left',minMargin: 2,fontSize: 12,fontFamily: 'Arial',fontStyle: 'normal',  // 正常样式normal;斜体样式italiccolor:'rgba(6, 6, 6, 1)', //标签字体颜色},// labelline不受return的控制,不受funtion的控制labelLine: {show: true,lineStyle: {color: 'rgba(48, 49, 51, 1)',type: 'solid', //线条形状}},labelLayout: {x:this.myChart.getWidth() - 400,y:this.myChart.getHeight()/3,moveOverlap: 'shiftY'},// prettier-ignoredata: [[-3.445,29.9859,"a"],[-1.418,25.7115,"b"],[-1.489,25.1274,"c"]],},{name: 'Up',color: 'rgba(255, 51, 51,1)',type: 'effectScatter',symbolSize:6,  //光圈大小emphasis: {focus: 'series'},label: {show: true,formatter: function (param) {return param.value[2]; // 显示 geneId},position: 'right',minMargin: 2,fontSize: 12,fontFamily: 'Arial',fontStyle: 'normal',  // 正常样式normal;斜体样式italiccolor:'rgba(6, 6, 6, 1)', //标签字体颜色},// labelline不受return的控制,不受funtion的控制labelLine: {show: true,lineStyle: {color: 'rgba(48, 49, 51, 1)',type: 'solid',// type: [5, 10], // 长短虚线间隔 [长度, 间隔]}},labelLayout: {x: this.myChart.getWidth() - 100,// y: this.myChart.getHeight()/1.7 - (Math.random() * 40 - 60),moveOverlap: 'shiftY'},// prettier-ignoredata: [[1.262,4.1255,"a"],[3.8047,3.5476,"b"],[1.2933,3.1948,"c"]],}],},});}, 1000); // 模拟网络延迟});},
    }
    
  3. 数据监听

    为了动态配置修改echarts的数据,采取VueX来实现数据的更新(频繁更新数据不调取接口,只有初始渲染和保存参数时才调用接口)

    watch: {// 改变颜色,监听的整个optionsvolcanoOptionsState: {deep:true,handler(newOptions) {// console.log(newOptions,"newOptions");if (this.myChart) {// 动态刷新this.myChart.setOption(newOptions,true);}}},// 宽高volcanoDimensions:{deep:true,handler(newDimensions) {if (this.myChart) {const newWidth = this.convertRemToPx(newDimensions.width);const newHeight = this.convertRemToPx(newDimensions.height);this.myChart.resize({ width: newWidth, height: newHeight });}}},
    },
    computed: {...mapState('echarts', ['volcanoOptionsState','volcanoDimensions','volcanoStyle']),
    },
    methods:{// 转换 rem 为 px,宽高前期没用百分比,所以涉及到单位转换convertRemToPx(rem) {const remToPx = parseFloat(getComputedStyle(document.documentElement).fontSize); // 获取 1rem 等于多少pxif (rem.endsWith('rem')) {return parseFloat(rem) * remToPx;}return rem; // 如果传入的不是 rem,直接返回原值},
    }
    
  4. 数据修改

    以其中一个配置项为例

    <div class="itemList"><div class="item"><span>宽</span><el-input-number v-model="volcanoWidth" controls-position="right" :min="1"></el-input-number></div><div class="item"><span>高</span><el-input-number v-model="volcanoHeight" controls-position="right" :min="1"></el-input-number></div><div class="item"><span>Down</span><el-color-picker v-model="volcanoColorsDown" show-alpha></el-color-picker></div><div class="item"><span>Up</span><el-color-picker v-model="volcanoColorsUp" show-alpha></el-color-picker></div><div class="item"><span>Nodiff</span><el-color-picker v-model="volcanoColorsNodiff" show-alpha></el-color-picker></div><div class="item"><span>图表样式</span><el-checkbox-group @change="changeVolcanoStyle" v-model="volcanoCheckbox"><el-checkbox label="显示边框"></el-checkbox><el-checkbox label="散点光圈"></el-checkbox></el-checkbox-group></div><div class="item"><span>散点大小</span><el-input-number v-model="volcanoScatterSizeNum" controls-position="right"></el-input-number></div><div class="item"><span>x/y轴偏移</span><div class="buttonGroup"><el-button @click="moveAxis('yAxis', 'decrease', 'min')">↑</el-button><div><el-button @click="moveAxis('xAxis', 'increase', 'max')">←</el-button><el-button @click="moveAxis('xAxis', 'decrease', 'min')">→</el-button></div><el-button @click="moveAxis('yAxis', 'increase', 'max')">↓</el-button></div></div>
    </div>
    volcanoWidth:{get(){return parseFloat(this.volcanoDimensions.width)},set(newWidth){this.updateVolcanoWidth(newWidth);}
    },
    volcanoHeight:{get(){return parseFloat(this.volcanoDimensions.height)},set(newHeight){this.updateVolcanoHeight(newHeight);}
    },
    volcanoColorsDown:{get(){return this.volcanoColors.down},set(newColor){this.updateVolcanoColorDown({name: 'Down', newColor});}
    },
    volcanoColorsUp:{get(){return this.volcanoColors.up},set(newColor){this.updateVolcanoColorUp({name: 'Up', newColor});}
    },
    

    就是基础的通过Vuex去监听数据的变化,通过set响应式修改,更新options刷新echarts图表。

  5. 代码封装

    动态生成getter和setter,以此类推

    // 宽高配置
    ...['width', 'height'].reduce((acc, dimension) => {acc[`volcano${dimension.charAt(0).toUpperCase() + dimension.slice(1)}`] = {get() {return parseFloat(this.volcanoDimensions[dimension]);},set(newValue) {const currentValue = parseFloat(this.volcanoDimensions[dimension]);if (currentValue !== newValue) {this[`updateVolcano${dimension.charAt(0).toUpperCase() + dimension.slice(1)}`](newValue);}}};return acc;
    }, {}),// 对于 x 轴和 y 轴的处理
    ...['X', 'Y'].reduce((acc, axis) => {['Title', 'TitleFontSize', 'TitleColor', 'LabelFontSize', 'LabelColor'].forEach(property => {const propName = `volcano${axis}${property}Value`;acc[propName] = {get() {return this[`volcano${axis}Axis${property}`];},set(newValue) {this[`updateVolcano${axis}${property}`](newValue); // 更新相应的 x/y 轴属性}};});return acc;
    }, {}),
    
  6. Echarts相关配置项对应

    • 标题
    title: {text:'火山图',    //名称left: 'center',     //居中/居左/居右textStyle:{fontFamily: 'Arial',fontSize: 18,color:'rgba(0,0,0, 1)'}
    },
    
    • 图表整体偏移
    grid: {left: '3%',    //相对偏移百分比right: '7%',bottom: '7%',containLabel: true,},
    
    • 鼠标移入显示信息
    tooltip: {// 鼠标移入显示参数,parmas为当前点的信息['x','y','自定义数据']formatter: function (params) {if (params.value.length > 1) {return ('X: ' + params.value[0] +'<br/>' +'Y: ' + params.value[1] +'<br/>' +'geneId: ' + params.value[2]);}},},
    
    • 图例
    legend: {data: ['Up', 'Down', 'Nodiff'],right: '10%',top: '20%',orient: 'vertical',// 给图例的原点点加了个边框// itemStyle:{//   borderWidth:1,//   borderColor:'black'// }},
    
    • x/y轴配置
    xAxis: 
    {type: 'value',scale: true,axisLabel: {formatter: '{value}',fontSize: 12,fontFamily: 'Arial',color: 'rgba(0,0,0, 1)',},min:'-25',max:'10',nameLocation:'middle',  //位置name:'x轴标题',nameGap: 30,  // 设置标题与轴的间隔nameTextStyle: { fontFamily: 'Arial', fontSize: 16,color: 'rgba(0,0,0, 1)',},
    },
    
    • series(以里面的一组数据为例)
    {name: 'Nodiff',color: 'rgba(192,192,192, 1)',type: 'scatter',   //否显示散点光圈,为effectScatter就是有,scatter就是纯点symbolSize:6,   //散点光圈大小,type为effectScatter时生效symbolSize:5, // 标记点的大小data:[[1,2,'自定义数据',{'a','b'}]],label: {show: true,formatter: function (param) {return param.value[2]; // 显示 '自定义数据'},position: 'left',minMargin: 2,fontSize: 12,fontFamily: 'Arial',fontStyle: 'normal',  // 正常样式normal;斜体样式italiccolor:'rgba(6, 6, 6, 1)', //标签字体颜色},labelLine: {show: true,lineStyle: {color: 'rgba(48, 49, 51, 1)',type: 'solid', //线条形状dashed/solid/dotted}},labelLayout: {x:this.myChart.getWidth() - 400,y:this.myChart.getHeight()/3,moveOverlap: 'shiftY'},
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480959.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软企业邮箱:安全可靠的企业级邮件服务!

微软企业邮箱的设置步骤&#xff1f;如何注册使用烽火域名邮箱&#xff1f; 微软企业邮箱作为一款专为企业设计的邮件服务&#xff0c;不仅提供了高效便捷的通信工具&#xff0c;更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…

33-ESP32-蓝牙篇-00

理解蓝牙技术及其协议栈结构 介绍 在物联网(IoT)领域&#xff0c;蓝牙技术因其低功耗和易用性而成为连接设备的首选无线通信协议之一。ESP32 支持双模蓝牙 4.2&#xff0c;并且已经获得双模蓝牙 4.2 认证和蓝牙 LE 5.0 认证 一、蓝牙技术概述 什么是蓝牙&#xff1f; 蓝牙…

fiddler安卓雷电模拟器配置踩坑篇

一、fiddler端配置 和网页版fiddler一样&#xff0c;需要首先再本机安装证书&#xff0c;可以参考我之前的fiddler浏览器配置文章&#xff0c;前期操作一致&#xff1a; 此处需要注意的是connections里面需要勾选allow remote这个选项&#xff0c;这个主要是为了后来再安卓模拟…

蓝桥杯备赛笔记(一)

这里的笔记是关于蓝桥杯关键知识点的记录&#xff0c;有别于基础语法&#xff0c;很多内容只要求会用就行&#xff0c;无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout&#xff1a; 1.3 string以下是字符串的一些简介&#xff1a;字符串…

【HarmonyOS NEXT】ACL 受限权限申请

关键词&#xff1a;受限开放权限、ACL、鸿蒙 在鸿蒙应用开发过程中&#xff0c;部分权限被受到限制&#xff08;如悬浮窗开发、读取联系人数据、读取公共目录音频文件等权限&#xff09;&#xff0c;但是在我们的应用开发过程中又不得不使用该权限时可向华为申请受限权限&#…

《安富莱嵌入式周报》第346期:开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波,开源固件安全分析器, 开源口袋电源,开源健康测量,FreeCAD

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频&#xff1a; https://www.bilibili.com/video/BV1TYBhYKECK/ 《安富莱嵌入式周报》第346期&#xff1a;开源2GHz带…

Unity3d C# 摄像头检测敌方单位(目标层级)并在画面中标注(含源码)

前言 需要实现的功能是通过一个专门的检测摄像头将出现在摄像头画面内的敌方单位检测出来&#xff0c;并通过框选的UI框在画面中标记出来。检测摄像头支持自动检测和手动控制检测&#xff0c;同时需要实现锁定模式&#xff0c;检测到一个敌方单位直接锁定到对象上等功能。 效…

【计算机网络】核心部分复习

目录 交换机 v.s. 路由器OSI七层更实用的TCP/IP四层TCPUDP 交换机 v.s. 路由器 交换机-MAC地址 链接设备和设备 路由器- IP地址 链接局域网和局域网 OSI七层 物理层&#xff1a;传输设备。原始电信号比特流。数据链路层&#xff1a;代表是交换机。物理地址寻址&#xff0c;交…

从0在自己机器上部署AlphaFold 3

本文介绍如何在自己本地机器上安装AlphaFold 3。 在10月份&#xff0c;Google DeepMind的首席执行官Demis Hassabis和高级研究科学家John M. Jumper所领导的团队&#xff0c;利用AI技术成功预测了几乎所有已知蛋白质的结构&#xff0c;开发出备受赞誉的AlphaFold&#xff0c;并…

大米中的虫子检测-检测储藏的大米中是否有虫子 支持YOLO,VOC,COCO格式标注,4070张图片的数据集

大米中的虫子检测-检测储藏的大米中是否有虫子 支持YOLO&#xff0c;VOC&#xff0c;COCO格式标注&#xff0c;4070张图片的数据集 数据集分割 4070总图像数 训练组 87&#xff05; 3551图片 有效集 9&#xff05; 362图片 测试集 4% 157图片 预处理 自动定向…

hdlbits系列verilog解答(Exams/m2014 q4a)-86

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节学习如何下图中的锁存器电路。 注意图中电路是锁存器,因此quartus会警告说推导出一个锁存器。 模块声明 module top_module ( input d, input ena, output q); 思路: 锁存器是一种对脉冲电平敏感的存储…

关于node全栈项目打包发布linux项目问题总集

1.用pm2部署nest 说明&#xff1a;如果一开始将nest直接打包放到linux服务器上用pm2执行则会报错&#xff0c;这是因为tsconfig.build.tsbuildinfo文件的路径以及相关依赖问题。 报错会为&#xff1a;什么东西找不到.... 所以建议以下为步骤一步一步配置 将整个nest添加压缩包直…

脉冲动画效果

js实现脉冲动画效果&#xff1a; 鼠标点击时&#xff0c;添加动画类&#xff0c;进而实现动画效果&#xff0c;鼠标离开时&#xff0c;移除动画类&#xff0c;回归静态图效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UT…

ollama部署bge-m3,并实现与dify平台对接

概述 这几天为了写技术博客,各种组件可谓是装了卸,卸了装,只想复现一些东西,确保你们看到的东西都是可以复现的。 (看在我这么认真的份上,求个关注啊,拜托各位观众老爷了。) 这不,为了实验在windows上docker里运行pytorch,把docker重装了。 dify也得重装: Dify基…

清远榉之乡托养机构探讨:自闭症的本质辨析

当人们谈及自闭症时&#xff0c;常常会产生一个疑问&#xff1a;自闭症是精神类疾病吗&#xff1f;今天&#xff0c;清远榉之乡托养机构就来为大家解开这个疑惑。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校&#xff0c;一直致力于为大龄自闭症患者提供专业的支持…

Linux自动化部署方法(Linux Automated Deployment Method)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

【Web】0基础学Web—html基本骨架、语义化标签、非语义化标签、列表、表格、表单

0基础学Web—html基本骨架、语义化标签、非语义化标签、列表、表格、表单 html基本骨架语义化标签图片属性a链接 非语义化标签特殊符号标签 列表无序列表结果展示 有序列表结果展示 定义列表结果展示 表格table属性tr属性结果展示 表单单标签form属性input属性selecttextareabu…

ADAM优化算法与学习率调度器:深度学习中的关键工具

深度学习模型的训练效果离不开优化算法和学习率的选择。ADAM&#xff08;Adaptive Moment Estimation&#xff09;作为深度学习领域中广泛应用的优化算法之一&#xff0c;以其高效性和鲁棒性成为许多任务的默认选择。而学习率调度器则是优化算法的“助推器”&#xff0c;帮助训…

飞塔防火墙只允许国内IP访问

飞塔防火墙只允许国内IP访问 方法1 新增地址对象&#xff0c;注意里面已经细分为中国内地、中国香港、中国澳门和中国台湾 方法2 手动新增国内IP的对象组&#xff0c;目前好像一共有8632个&#xff0c;每个对象最多支持600个IP段

C语言进阶7:程序环境与预处理

本章重点 程序的翻译环境程序的执行环境详解&#xff1a;C语言程序的编译 链接预定义符号介绍预处理指令 #define宏和函数的对比预处理操作符#和##的介绍命令定义预处理指令 #include预处理指令 #undef条件编译 1.程序的翻译环境和执行环境 在ANSIC的任何一种实现中&#x…