电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

电子发烧友网>控制/MCU>C51编译器中的预处理器指令及使用解析

C51编译器中的预处理器指令及使用解析

收藏

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论

查看更多

相关推荐

C51的函数指针

/M-51编译器时,他们引入了在固定内存位置存储参数的技术。 当调用链接时,它构建程序的调用树,找出哪些函数参数是互斥的,并覆盖它们。 这是链接覆盖指令的开始。 由于PL/M-51不支持函数指针
2023-09-04 08:29:44

C51编译器如何区分位地址和字节地址?

C51编译器如何区分位地址和字节地址
2023-10-25 07:10:55

C51编译器如何区分位地址和字节地址?

C51编译器如何区分位地址和字节地址
2023-10-31 08:30:06

C51编译器支持的数据类型有哪些

、short、long、float与double,它们存储数据的长度是有差异的,而在C51编译器,int与short是一样的,float与double也是一样的,我们通过表格来看看它们具体的定义:对于unsigned char、signed char、unsigned int、signed int、unsign
2021-11-30 08:06:34

C51支持C++语言吗?

C51支持C++语言吗?如果不支持,那个编译器支持C++开发8051系列单片机?
2014-02-08 10:45:32

C51智能反编译器 简单实用

C51智能反编译器和我自己编的差不多,提供HEX,BIN,汇编3种转换,简单实用,分享给大家
2012-08-08 16:50:27

C51的内存空间利用手册

C51使用ROM指令(C51手册的第49页)来帮助优化调用和跳转指令。 如果您使用飞利浦精简指令处理器之一,如80C751或80C752,则必须使用ROM(Small)指令,以便C51仅生成
2023-09-04 07:07:36

C51语言用编程的若干问题

本帖最后由 luna 于 2011-3-3 12:08 编辑 简要介绍了FRANKLIN C51交叉编译器的特点,较详细地讨论过C51语言程序设计的基本技巧及其与汇编语言的混合编程、中断处理过程等实际问题,并给出了相应的处理程序。
2011-03-02 14:03:04

C/C++程序编译流程

编译错误或警告时能够显示行号保留所有的#pragma编译器指令2. 编译预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。3. 汇编将编译完的汇编代码文件翻译成机器
2016-04-17 16:24:56

C语言编译器在嵌入式系统的作用

而在嵌入式系统方面,可用的C语言编译器就非常丰富了,比如:用于 Keil 公司 51 系列单片机的 Keil C51 编译器;当前大红大紫的 Arduino 板搭载的开发套件,可用针对 AVR
2021-12-15 06:27:31

C语言之预处理

编译预处理器C语言编译器的一个重要组成部分。很好的利用C语言的预处理命令可以增强代码的可读性,灵活性,和易于修改等特点,便于程序的结构化。预处理命令由符号“#”开头,包括宏定义,文件包含,条件处理
2017-06-03 17:23:43

C语言的预处理指令有何功能

C语言的预处理指令有何功能?C语言的预处理指令有哪些要求呢?
2022-02-25 07:20:37

c51与cx51有什么区别?

我用Keil_uVision3看到编译器C51和CX51,请问各位大侠c51与cx51有什么区别
2014-02-07 09:11:17

编译器不知道如何处理“Extn”指令

我一直在试图把一些项目分割成多个可重用的文件,这并不是一件容易的事情。我终于解决了问题,除了最后一个错误:编译器/汇编程序不知道如何处理“Extn”指令,就像试图从其他文件导入子程序和变量标签一样
2019-09-23 12:58:36

编译器的相关资料分享

路径(如:D:\KeilV805软件\C51)----在“编译器选择”中选中第二个选项—然后单击“确定”完成设置之后,新建一个文件----编写程序源代码-----单击“保存”—键入保存“文件名”(必须加
2021-12-01 08:05:22

预处理器在Build Settings定义错误

:“编译器”和“正确的语法预处理器定义”(TestValay= 1)(见屏幕截图2)PSoC Creator把定义定义为“1=”而不是“1”。所以代码没有显示正确,格雷码确实是编译的!编译器工作
2019-02-22 06:25:24

ARM编译器ARM CC++库及浮点支持用户指南

它。 如果您在没有协处理器的系统上编译编译器将在软件实现计算。 例如,编译器选项--fpu=vfp选择硬件VFP协处理器,而选项--fpu=softwfp指定算术运算将在软件执行,而不使用任何协处理器指令
2023-08-16 07:36:57

ARM编译器的分类(上)

,这样编译指令,就是目标在该处理器上执行的指令。使用armclang –target=aarch64-arm-none-eabi –mcpu=list查看 aarch64下支持的处理器
2022-08-04 14:36:55

Arm C/C++编译器22.1版开发人员和参考指南

提供帮助您使用ARM®编译器Linux版的ARM®C/C++编译器组件的信息。 ARM®C/C++编译器是一款自动矢量化的Linux空间CC++编译器,专为服务和高性能计算(HPC)工作负载量身定做。 ARM®C/C++编译器支持标准CC++源代码,并针对基于ARM®V8-A的处理器进行了调整
2023-08-11 07:46:02

Arm编译器6.6版armclang参考指南

Arm®编译器armclang参考指南提供了Arm编译器armclaang的用户信息。armclang是一个优化的CC++编译器,它将标准C和标准C++源代码编译为基于Arm体系结构的处理器的机器代码
2023-08-11 07:35:47

E2413C Motorola ***预处理器接口

E2413C Motorola ***预处理器接口
2019-03-14 20:20:00

KEIL C51开发工具版本比较

√√√BL51代码空间连接 √√√OH51对象的十六进制转换 √√√OC51 banked 目标转换 √√√C51编译器 √√ISD51在系统调试 √FlashMON51目标监控 √MON51目标监控
2014-10-13 14:46:27

KEIL5编译环境的c51和MDK共存的教程

做为一个底层硬件小苦逼,经常需要用到stm32和51单片机,于是在keil for C51和mdk来回换编译器,换来换去真是是人令人窒息。所以今天就给大家带来了KEIL5编译环境的c51和MDK
2021-07-15 08:50:38

Keil C51C51程序与汇编程序的接口方法

Cx51编译器能对C51源程序进行高效率的编译,生成高效简洁的目标代码,在绝大多数场合采用C语言编程即可完成预期的任务。尽管如此,有时仍需要采用一定的汇编语言程序,如对于某些特殊的I/O接口地址
2011-03-04 15:18:10

Keil C51变量的使用方法详解

Keil C51可使用以下方法: 这两种方式效果是完全相同的,但在目标代码变量t仅占用1位(即1/8字节),而且因为51内核单片机指令系统中有位处理指令,生成的目标代码占用内存少、运行
2011-11-30 17:21:47

Keil C51对双数据指针的直接利用

Keil C51对双数据指针的支持情况  作为一个常用的C51编译器,Keil C51是支持双数据指针的,但并不是直接支持。如果要在C51程序中使用双数据指针,有一些特别的要求。  首先来看Keil
2011-11-30 17:30:00

Keil C51编译器

的Keil Software Inc 。Keil公司制造和销售种类广泛的开发工具,包括ANSI C编译器、宏汇编程序、调试、连接、库管理、固件和实时操作系统核心(real-time kernel)。Keil C51编译器自1988年引入市场以来成为事实上的行业标准,并支持超过500种8051变种。Ke
2021-07-16 06:20:27

Keil C51编译器的使用

编译单片机工程,但是它的编译其实也是调用了"C51"编译器来完成的,所以我们将着重讲解一下"C51"文件夹;C51文件夹下有以下文件夹(1).ASM
2012-02-06 14:01:33

Keil C51使用教程---C51 vs 标准C

Keil C51使用教程---C51 vs 标准C第一节 Keil C51编译器的控制指令  C51编译器的控制指令分为三类:源文件控制类,目标文件控制类及列表控制类。1. 源文件
2008-10-06 18:26:39

Keil C51使用教程---开发系统基本知识

功能及使用简介1. C51与A51(1) C51C51C语言编译器,其使用方法为:C51  sourcefile[编译控制指令]或者  C51
2008-10-06 18:24:45

Keil C51汇编混合编程详解

c51写出这个函数的主体,然后用SRC控制指令编译产生asm文件,进一步修改这个asm文件就得到我们所要的汇编函数。该方法让编译器自动完成各种段的安排,提高了汇编程序的编写效率。 step1. 按写
2018-07-13 09:35:01

RealView编译工具NEON矢量化编译器指南

RVCT提供了armcc--Vectorize,这是ARM编译器的一个矢量化版本,它以带有neon单元的ARM处理器为目标,比如Cortex-A8。 向量化意味着编译器直接从CC++代码生成霓虹灯
2023-08-12 06:22:28

STM32 C语言预处理解析

作者:张角老师(张飞实战电子高级工程师)大家好, 我们今天对C语言的预处理指令做一个总结。其实C语言的预处理指令,主要有三大类,文件包含、宏定义和条件编译。我们首先要明白什么是预处理?第二个C语言
2021-07-22 09:03:22

STM32CubeIDE暗模式预处理器突出显示错误怎么解决?

我在 Ubuntu 18.04 系统上运行 STM32CubeIDE。我已将其切换为暗模式进行编程,但代码的任何“ #if ”预处理器指令都有浅色背景。这使得无法阅读。我已经查看了语法着色的所有
2022-12-01 07:39:57

gcc 编译器编译过程详解

gcc 编译器 1,在使用gcc编译程序时,编译过程可以细分为4个阶段:1)预处理2)编译3)汇编4)链接 Linux程序员可以根据自己的需要让gcc在编译的任何阶段结束,检查或使用编译器在该阶段
2018-07-03 09:51:12

gcc编译器编译过程介绍

gcc 编译器 1,在使用gcc编译程序时,编译过程可以细分为4个阶段:1)预处理2)编译3)汇编4)链接 Linux程序员可以根据自己的需要让gcc在编译的任何阶段结束,检查或使用编译器在该阶段
2018-07-09 07:49:03

kei C51 命令行编译

kei C51 命令行编译,在一些测试软件,需要测试编译器的安全稳定性,需要用到命令行形式
2017-03-24 15:50:44

keil C编译器详解

本手册讲述对8051的目标环境 如何使用Cx51优化C编译器编译C程序Cx51编译器包可以用在所有的8051系列处理器上可以在WINDOWS 32位命令行执行本手册假定你熟悉WINDOWS操作系统
2014-08-26 22:43:42

preproceesor编译器和链接是如何工作的?

包括γ.H.My猜想是:1。预处理器指令IPC18FYLCDAppApp1.1.C2的预处理器。将PIC18FYLCDCDAPAP1.1.C编译成目标文件,在此过程链接将帮助查找头文件3的实现
2019-03-28 07:53:01

s3c2410协处理器指令的意思是什么?

呵呵,s3c2410...在vivi的s3c2410.h文件设置时钟时 有这么一段mrc p15,0,r1,c1,c0,0orr r1,r1,#0xc0000000;mcr p15,0,r1,c1,c0,0这段的每句 的意思是什么?为什么要用到些处理器指令?协处理器指令的作用是干什么?
2019-02-25 12:34:48

μC/OS-II操作系统在3种处理器上的移植,你会哪一种???

Keil公司的集成开发环境作为开发工具,因为该集成开发环境的C51编译器能产生可重入型代码,且用C语言就可以开/关中断。同时具有一定数量的堆栈和操作相关寄存指令。 LPC2210:采用ARM7
2017-08-10 10:59:41

μC/OS-II操作系统在各种处理器上的移植

环境的C51编译器能产生可重入型代码,且用C语言就可以开/关中断。同时具有一定数量的堆栈和操作相关寄存指令。 LPC2210:采用ARM7微控制可以满足上述②、④、⑤,而ADS1.2的C编译器可以
2017-08-14 09:46:10

交叉编译器解析

) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接 (Linker) → 可执行程序 (executables) 。一
2016-12-16 09:47:47

交叉编译器解析

) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接 (Linker) → 可执行程序 (executables) 。一
2016-12-21 16:57:13

什么是Keil C51、MDK?

一、什么是Keil C51、MDK?Keil C51和MDK是Keil公司开发的两套不同的工具集,包括了编译器、链接等工具,以及集成了这些工具的集成开发环境(IDE),这个集成开发环境叫
2022-01-24 07:30:03

你知道Verilog HDL编译器指令都有哪些吗

编译器命令,将按照它们在Verilog HDL源文件的描述顺序和评估第一个’elsif编译器指令的方法,对这些指令进行评估;⑧如果有一个’else编译器命令,则将’else所包含的行作为描述的一部分
2022-10-14 14:34:02

使用Arduino IDE编译器指令的疑问求解

代码中看到了很多编译器指令。LOCAL void ICACHE_FLASH_ATTR some_function(int a, char*c)之类的指令我假设这些指令告诉链接将代码放在运行串行闪存
2023-06-12 07:01:47

使用S32 Design Studio for ARM Version 2018.R1发布模式下预处理器指令的问题如何处理

但是将 RELEASE 定义为预处理器没有效果,RELEASE define 的代码不考虑编译。 如果我在调试模式配置中使用预处理器指令 DEBUG,那么它们又是一个问题,然后在发布模式它也被
2023-05-31 08:15:53

关与编译器

51单片机的编译器 keil C51 与 uvision2 是什么关系?该用哪一个?
2012-07-05 17:47:45

关与编译器的问题

51单片机的编译器 keil C51 与 uvision2 是什么关系?该用哪一个?
2012-07-05 17:46:20

关于编译器

51单片机的编译器 keil C51 与 uvision2 是什么关系?该用哪一个?
2012-07-05 17:50:04

关于编译器

51单片机的编译器 keil C51 与 uvision2 是什么关系?该用哪一个?
2012-07-05 17:55:24

单片机编译器之链接-蔡军生-专题视频课程 精选资料分享

由于芯片的重要性,越来越重要,以及“核高基”项目越来越多,很多自主的CPU芯片,都需要开发自己的编译器,以便实现自主指令运行。那么开发编译器的人才就越来越重要,本课程就本着培训开发实际编译器的目的来教学。本系列课程包含预处理C编译器、汇编编译器、链接。...
2021-07-19 08:39:03

可以使用预处理指令创建条件编译

条件编译可以使用预处理指令创建条件编译,即可以使用这些指令告诉编译器根据编译时的条件执行或忽略代码块。#ifdef、#else和#endif指令我们用一个示例来看这几个指令:#ifdef HI
2022-02-25 06:07:09

如何使用C51运行库预定义宏

Read_SP37_ID(unsigned char idata *IDH,unsigned char idata *IDL){*IDH = CBYTE[0x57E0];*IDL = CBYTE[0x57E1];}一.使用C51运行库预定义宏C51编译器提供了一组宏定义来对51系列单片机的cod
2021-12-02 07:55:42

如何使用PIC32 MZ2048 EFM124处理器和XC32版本1.40编译器

我正在研究一个项目,我们使用PIC32 MZ2048 EFM124处理器和XC32版本1.40编译器。与c32编译器相比,xc32编译器对NOP以外的指令使用分支延迟槽。这导致一些问题,因为分支延迟
2020-05-05 08:02:14

如何将预处理器定义添加到TouchGFX Designer?

嗨@Martin KJELDSEN(员工) 是否可以向 TouchGFX Designer 添加预处理器定义?在 Visual Studio 这很容易,但是当我尝试在设计运行应用程序时却失败了。如何将预处理器定义添加到设计(如 SIMULATOR)。马可
2023-01-03 08:12:50

如何构建我自己的嵌入式C编译器

只是为了获得如何构建我自己的嵌入式 C 编译器的知识,如预处理、汇编、链接、生成 Hex 文件、elf 文件、映射文件。 任何有用的链接可用? 我是嵌入式软件工程师,并且具有 c 编程 python、bat 脚本方面的知识。
2023-06-08 08:10:28

嵌入式学习指引--GCC编译器介绍

编译工作原理有很好的帮助。  GCC编译器首先做的工作是预处理:调用-E参数可以让GCC在预处理结束后停止编译过程。  # gcc –E test.c -o test.i  编译器在这一步调用cpp工具来对源程序进行预处理,此时会生成test.i文件,下面部分列出了test.i文件的内容。
2011-03-11 18:10:04

怎么使用#assert预处理程序指令

大家好。在我的源代码,我使用“assert”预处理器指令来检查常量值的一致性。如果我以简单的方式使用它,通过直接赋值,一切如预期:define ABC 0x7Fassert ABC
2020-04-15 09:41:57

怎么使用预处理程序指令

你好, 我想使用预处理器指令进行条件编译。我有一段代码,我想在定义预处理器指令时包含这些代码。在SPC5Studio定义它的位置?这需要哪些设置? 在此先感谢您的回复。 麦克风。以上来自于谷歌
2019-06-21 07:21:02

请问如何使用预处理指令#pragma禁止优化某段代码?哪里有c2000编译器预处理指令的说明资料?

本帖最后由 一只耳朵怪 于 2018-6-13 16:51 编辑 如何使用预处理指令#pragma禁止优化某段代码?哪里有c2000编译器预处理指令的说明资料?
2018-06-13 04:57:37

请问有没有办法让psoc creator预处理程序集文件?

GCC编译器通过预处理器自动地运行.s文件,而在将它们交给汇编之前单独离开S文件。有没有办法让PSoC Creator以同样的方式对待文件?我把一个.s文件添加到我的项目中,但是它没有通过预处理器运行。
2019-10-14 10:54:06

cx51编译器用户手册

本手册讲述对8051 的目标环境,如何使用Cx51优化C 编译器编译C 程序。Cx51 编译器包可以用在所有的8051 系列处理器上,可以在WINDOWS 32 位命令行中执行本手册。假定你熟悉WINDO
2008-10-07 15:06:2732

C51编译器软件 V6.02

C51编译器软件 KEIL V6.02
2008-12-27 15:51:5671

Keil C51编译器用户手册 中文版

Keil C51编译器用户手册 中文版:本手册讲述对8051 的目标环境,如何使用Cx51 优化C 编译器编译C 程序Cx51 编译器包,可以用在所有的8051 系列处理器上,可以在WINDOWS 32 位命令行中执行
2009-08-06 08:51:310

C语言的编译预处理

在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(m
2009-09-20 18:17:4647

KEIL C51 Vision2 中文入门教程

KEIL C51 Vision2 中文入门教程 本手册讲述对8051 的目标环境如何使用Cx51 优化C 编译器编译C 程序Cx51 编译器包可以用在所有的8051 系列处理器上可以在WINDOWS 32 位
2010-03-09 14:50:23128

Cx51编译器使用手册

Cx51编译器使用手册 对传统和扩展的8051 微处理器的优化的C 编译器和库参考 本手册讲述对8051 的目标环境如何使用Cx51 优化C 编译器编译C 程序Cx51
2010-03-12 10:24:1032

C51智能反编译器

C51智能反编译器
2010-04-07 17:36:5763

MCS-51程序空间扩展原理及编译器优化

讨论了MCS-51系列单片机程序空间扩展的原理,包括硬件与编译器两个方面,并提出一种编译器优化方案.该方案在Keil仿真器上检验并通过关健词:C51编译软件;MCS-51; B ankS witching
2010-10-23 08:55:25100

C51智能反编译器【bo;bo】

C51智能反编译器
2016-05-09 10:59:2610

基于51单片机--C语言之预处理总结

编译预处理器是C语言编译器的一个重要组成部分。很好的利用C语言的预处理命令可以增强代码的可读性,灵活性,和易于修改等特点,便于程序的结构化。
2016-08-17 10:48:27994

C51指令

C51指令
2016-12-11 23:38:399

多层异构粗粒度可重构处理器编译器后端设计

多层异构粗粒度可重构处理器编译器后端设计_刘毅超
2017-01-07 20:43:121

基于FPGA处理器的C编译指令

Vviado-HLS基于Xilinx FPGA对C的解析,综合原理。Vivado-HLS FPGA并行与处理器架构 与处理器架构相比,FPGA结构具有更高的并行。Vivado-HLS对软件C程序编译时与处理器编译是不一样的执行机制。
2017-11-18 12:23:092377

verilog编译指令_verilog编译器指示语句(数字IC)

以`(反引号)开始的某些标识符是编译器指令。在Verilog 语言编译时,特定的编译器指令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其它的不同编译程序指令
2018-03-23 13:40:4013585

CCS编译器的使用手册资料免费下载

在下面的学习中我们对PIC系列单片机选用MPLAB软件编写代码,编译器选用CCS编译器,不管是51单片机系统的开发还是PIC系列单片机的开发,其基础全是C语言(或者汇编语言),所不同的是各个编译器拥有不同的数据类型定义和各种特殊的处理器指令以及预处理指令
2019-01-28 16:07:5318

浅析VerilogHDL编译系统的预处理

。在Verilog HDL语言编译时,特定的编译指令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其他不同的编译程序指令。常用的编译预处理语句如下:
2019-03-26 16:10:41643

C语言编译器常见的预编译指令详细资料说明

编译器对C程序的处理可以明确地分为两步。第一步由预编译器完成。以#开头的预编译指令可能会影响编译器设置或者进行文本替换。注意,预编译器变量(标识符)和正常的C变量是不一样的。预编译完成之后,编译器将不会看到任何预编译指令或标识符。下面介绍常见的预编译指令
2019-06-05 17:52:002

C51预处理命令和用户配置文件详细资料说明

用户编写的C51程序代码只能控制程序的执行流程,若要对编译程序进行操作,就要用到预处理命令。在编译环境对源程序进行编译前,先对程序中的预处理命令进行处理,然后将处理结果和源程序一起进行编译
2020-03-19 14:52:006

C语言预处理指令及分类

C/C++ 程序中的源代码中包含以 # 开头的各种编译指令,这些指令称为预处理指令预处理指令不属于 C/C++ 语言的语法,但在一定意义上可以说预处理扩展了 C/C++。
2020-11-29 10:14:381959

Verilog HDL 编译器指令说明

Verilog HDL 编译器指令 复杂一点的系统在进行设计或者验证时,都会用到一些编译器指令,那么什么是编译器指令?   Verilog HDL编译器指令由重音符(‘)开始。在Verilog 语言
2021-11-03 09:31:562953

你用的ARM处理器该选择哪个编译器

现在的嵌入式开发大部分都是ARM处理器了,从MCU级别的M0,M3,M4,M23,M33,到MPU级别的ARM9,ARM11,ARM-A5x,ARM-A7x。开发者很少去注意使用的编译器,一般都是
2021-12-01 13:36:091

嵌入式C预处理器的基本概念和常用指令

在嵌入式系统开发中,C预处理器是非常重要的一部分,可以在编译之前对源代码进行宏替换、条件编译和包含等处理。在本文中,我们将介绍嵌入式C预处理器的基本概念和常用指令
2023-04-13 16:11:06644

介绍嵌入式C预处理器的基本概念和常用指令

在嵌入式系统开发中,C预处理器是非常重要的一部分,可以在编译之前对源代码进行宏替换、条件编译和包含等处理
2023-05-20 15:14:14354

SDCC-Linux下的51 MCU编译器

SDCC (小型设备C编译器)是为8位微控制器开发的免费C编译器。尽管兼容多种不同体系结构,但SDCC C编译器更适合8051内核。 SDCC是命令行固件开发工具,含预处理器编译器、汇编器、链接
2023-06-16 15:19:073209

C语言中的预处理器

所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。
2024-03-01 12:16:24194

C预处理器及其工作原理

C预处理器(C Pre-Processor)也常简写为 CPP,是一个与 C 编译器独立的小程序,预编译器并不理解 C 语言语法,它仅是在程序源文件被编译之前,实现文本替换的功能。
2024-03-12 14:14:09110

已全部加载完成