【嵌入式】C51 和标准 C 语言的关键字对比详解

LuckiBit

C51 和标准 C 语言的关键字对比详解

1. 概述

C51 和标准 C 语言在关键字上有显著的差异,主要是因为 C51 是专门为 8051 单片机设计的编程语言,它添加了一些特定的关键字以便更高效地进行硬件控制和内存管理。而标准 C 语言则是通用的编程语言,适用于各种平台。本文将通过表格和详细解释,全面对比 C51 和标准 C 语言的关键字,帮助读者更好地理解两者的区别。

2. C51 和标准 C 语言的关键字对比

以下是 C51 和标准 C 语言的关键字对比表格,包括两者的全部关键字:

2.1 关键字对比表

C51 关键字说明标准 C 语言关键字说明
bit位变量,占用 1 位内存auto自动存储类别
sfr特殊功能寄存器break跳出循环或 switch 语句
sbit特殊功能寄存器中的位caseswitch 语句中的一个分支
data内部数据存储器char字符型变量
idata内部间接数据存储器const常量
pdata页间接数据存储器continue继续下一次循环
xdata外部数据存储器defaultswitch 语句中的默认分支
code程序存储器(ROM)dodo-while 循环
bdata位寻址区域double双精度浮点型变量
interrupt定义中断服务函数elseif 语句的另一分支
using指定寄存器组enum枚举类型
reentrant可重入函数extern声明变量在外部定义
--float单精度浮点型变量
--forfor 循环
--goto无条件跳转
--if条件语句
--int整型变量
--long长整型变量
--register寄存器变量
--return返回语句
--short短整型变量
--signed有符号变量
--sizeof获取变量大小
--static静态变量
--struct结构体
--switch多路分支语句
--typedef类型定义
--union联合体
--unsigned无符号变量
--void空类型
--volatile易变变量
--whilewhile 循环
--_Alignas指定对齐方式
--_Alignof获取对齐方式
--_Atomic原子类型
--_Bool布尔类型
--_Complex复数类型
--_Generic泛型选择器
--_Imaginary虚数类型
--_Noreturn无返回值类型
--_Static_assert静态断言
--_Thread_local线程局部存储

2.2 对比表详细解释

2.2.1 C51 特定关键字
  • bit:用于定义位变量,占用 1 位内存。
  • sfr:用于定义特殊功能寄存器,映射硬件寄存器地址。
  • sbit:用于定义特殊功能寄存器中的位。
  • data:用于将变量存储在内部数据存储器中。
  • idata:用于将变量存储在内部间接数据存储器中。
  • pdata:用于将变量存储在页间接数据存储器中。
  • xdata:用于将变量存储在外部数据存储器中。
  • code:用于将常量或只读数据存储在程序存储器(ROM)中。
  • bdata:用于将变量存储在位寻址区域中。
  • interrupt:用于定义中断服务函数。
  • using:用于指定寄存器组,以优化寄存器使用。
  • reentrant:用于定义可重入函数,允许函数在中断中被调用。
2.2.2 标准 C 语言关键字
  • auto:用于定义自动存储类别的变量。
  • break:用于跳出循环或 switch 语句。
  • case:用于定义 switch 语句中的一个分支。
  • char:用于定义字符型变量。
  • const:用于定义常量。
  • continue:用于继续下一次循环。
  • default:用于定义 switch 语句中的默认分支。
  • do:用于定义 do-while 循环。
  • double:用于定义双精度浮点型变量。
  • else:用于定义 if 语句的另一分支。
  • enum:用于定义枚举类型。
  • extern:用于声明变量在外部定义。
  • float:用于定义单精度浮点型变量。
  • for:用于定义 for 循环。
  • goto:用于无条件跳转。
  • if:用于定义条件语句。
  • int:用于定义整型变量。
  • long:用于定义长整型变量。
  • register:用于定义寄存器变量。
  • return:用于定义返回语句。
  • short:用于定义短整型变量。
  • signed:用于定义有符号变量。
  • sizeof:用于获取变量大小。
  • static:用于定义静态变量。
  • struct:用于定义结构体。
  • switch:用于定义多路分支语句。
  • typedef:用于定义类型别名。
  • union:用于定义联合体。
  • unsigned:用于定义无符号变量。
  • void:用于定义空类型。
  • volatile:用于定义易变变量。
  • while:用于定义 while 循环。
  • _Alignas:用于指定对齐方式。
  • _Alignof:用于获取对齐方式。
  • _Atomic:用于定义原子类型。
  • _Bool:用于定义布尔类型。
  • _Complex:用于定义复数类型。
  • _Generic:用于定义泛型选择器。
  • _Imaginary:用于定义虚数类型。
  • _Noreturn:用于定义无返回值类型。
  • _Static_assert:用于定义静态断言。
  • _Thread_local:用于定义线程局部存储。

通过以上表格和解释,我们可以看到 C51 和标准 C 语言在关键字上的差异。C51 引入了许多特定的关键字,以便更高效地进行硬件控制和内存管理,而标准 C 语言则更通用,适用于更广泛的平台和应用。

2.3 C51 特定关键字

关键字说明示例
bit位变量,占用 1 位内存bit myBitVar;
sfr特殊功能寄存器sfr P1 = 0x90;
sbit特殊功能寄存器中的位sbit P1_0 = P1^0;
data内部数据存储器unsigned char data myDataVar;
idata内部间接数据存储器unsigned char idata myIDataVar;
pdata页间接数据存储器unsigned char pdata myPDataVar;
xdata外部数据存储器unsigned char xdata myXDataVar;
code程序存储器(ROM)const char code myString[] = "Hello, world!";
bdata位寻址区域unsigned char bdata myBDataVar;
interrupt定义中断服务函数void timer0_isr(void) interrupt 1 { /* ISR code */ }
using指定寄存器组void myFunction(void) using 1 { /* Function code */ }
reentrant可重入函数void myReentrantFunc(void) reentrant { /* Code */ }

2.4 标准 C 语言关键字

关键字说明示例
auto自动存储类别auto int a;
break跳出循环或 switch 语句break;
caseswitch 语句中的一个分支case 1: break;
char字符型变量char c = 'A';
const常量const int max = 100;
continue继续下一次循环continue;
defaultswitch 语句中的默认分支default: break;
dodo-while 循环do { /* code */ } while (condition);
double双精度浮点型变量double d = 3.14;
elseif 语句的另一分支else { /* code */ }
enum枚举类型enum colors { RED, GREEN, BLUE };
extern声明变量在外部定义extern int globalVar;
float单精度浮点型变量float f = 3.14f;
forfor 循环for (int i = 0; i < 10; i++) { /* code */ }
goto无条件跳转goto label;
if条件语句if (condition) { /* code */ }
int整型变量int n = 42;
long长整型变量long l = 1234567890L;
register寄存器变量register int fastVar;
return返回语句return 0;
short短整型变量short s = 32767;
signed有符号变量signed int si = -10;
sizeof获取变量大小sizeof(int);
static静态变量static int count = 0;
struct结构体struct Point { int x; int y; };
switch多路分支语句switch (n) { case 1: break; }
typedef类型定义typedef unsigned int uint;
union联合体union Data { int i; float f; };
unsigned无符号变量unsigned int u = 10;
void空类型void func(void);
volatile易变变量volatile int v;
whilewhile 循环while (condition) { /* code */ }
_Alignas指定对齐方式_Alignas(16) int a;
_Alignof获取对齐方式_Alignof(int);
_Atomic原子类型_Atomic int atomicVar;
_Bool布尔类型_Bool flag = 1;
_Complex复数类型_Complex double z = 1.0 + 2.0i;
_Generic泛型选择器_Generic(x, int: "int", float: "float");
_Imaginary虚数类型_Imaginary float y = 1.0i;
_Noreturn无返回值类型_Noreturn void exit(int);
_Static_assert静态断言_Static_assert(sizeof(int) == 4, "int size");
_Thread_local线程局部存储_Thread_local int tlVar;

3. 示例详细解释

3.1 C51 特定关键字

bit

用于定义位变量,占用 1 位内存,节省空间。

示例

bit myBitVar;
sfr

用于定义特殊功能寄存器,映射硬件寄存器地址。

示例

sfr P1 = 0x90;
sbit

用于定义特殊功能寄存器中的位。

示例

sbit P1_0 = P1^0;
data

用于将变量存储在内部数据存储器中。

示例

unsigned char data myDataVar;
idata

用于将变量存储在内部间接数据存储器中。

示例

unsigned char idata myIDataVar;
pdata

用于将变量存储在页间接数据存储器中。

示例

unsigned char pdata myPDataVar;
xdata

用于将变量存储在外部数据存储器中。

示例

unsigned char xdata myXDataVar;
code

用于将常量或只读数据存储在程序存储器(ROM)中。

示例

const char code myString[] = "Hello, world!";
bdata

用于将变量存储在位寻址区域中。

示例

unsigned char bdata myBDataVar;
interrupt

用于定义中断服务函数。

示例

void timer0_isr(void) interrupt 1 {
    /* ISR code */
}
using

用于指定寄存器组,以优化寄存器使用。

示例

void myFunction(void) using 1 {
    /* Function code */
}
reentrant

用于定义可重入函数,允许函数在中断中被调用。

示例

void my

**示例**:
```c
void myReentrantFunc(void) reentrant {
    /* Code */
}

3.2 标准 C 语言关键字

auto

用于定义自动存储类别的变量,默认存储类别。

示例

auto int a;
break

用于跳出循环或 switch 语句。

示例

break;
case

用于定义 switch 语句中的一个分支。

示例

case 1:
    break;
char

用于定义字符型变量。

示例

char c = 'A';
const

用于定义常量,变量的值不能被修改。

示例

const int max = 100;
continue

用于继续下一次循环。

示例

continue;
default

用于定义 switch 语句中的默认分支。

示例

default:
    break;
do

用于定义 do-while 循环,先执行循环体再判断条件。

示例

do {
    /* code */
} while (condition);
double

用于定义双精度浮点型变量。

示例

double d = 3.14;
else

用于定义 if 语句的另一分支。

示例

if (condition) {
    /* if code */
} else {
    /* else code */
}
enum

用于定义枚举类型。

示例

enum colors {
    RED,
    GREEN,
    BLUE
};
extern

用于声明变量在外部定义,通常用于跨文件共享变量。

示例

extern int globalVar;
float

用于定义单精度浮点型变量。

示例

float f = 3.14f;
for

用于定义 for 循环。

示例

for (int i = 0; i < 10; i++) {
    /* code */
}
goto

用于无条件跳转到标签。

示例

goto label;
if

用于定义条件语句。

示例

if (condition) {
    /* code */
}
int

用于定义整型变量。

示例

int n = 42;
long

用于定义长整型变量。

示例

long l = 1234567890L;
register

用于定义寄存器变量,提示编译器将变量存储在寄存器中以提高访问速度。

示例

register int fastVar;
return

用于定义返回语句,返回函数的结果。

示例

return 0;
short

用于定义短整型变量。

示例

short s = 32767;
signed

用于定义有符号变量。

示例

signed int si = -10;
sizeof

用于获取变量或数据类型的大小。

示例

sizeof(int);
static

用于定义静态变量,其作用域仅限于所在的函数或文件,但其值在函数调用结束后仍然存在。

示例

static int count = 0;
struct

用于定义结构体。

示例

struct Point {
    int x;
    int y;
};
switch

用于定义多路分支语句,根据变量的值执行不同的代码块。

示例

switch (n) {
    case 1:
        break;
    default:
        break;
}
typedef

用于定义类型别名。

示例

typedef unsigned int uint;
union

用于定义联合体,可以在同一内存空间中存储不同类型的数据。

示例

union Data {
    int i;
    float f;
};
unsigned

用于定义无符号变量。

示例

unsigned int u = 10;
void

用于定义空类型,常用于函数返回类型表示不返回值。

示例

void func(void);
volatile

用于定义易变变量,提示编译器该变量可能会被程序外的因素修改,不应优化。

示例

volatile int v;
while

用于定义 while 循环,只要条件为真就反复执行循环体。

示例

while (condition) {
    /* code */
}
_Alignas

用于指定对齐方式。

示例

_Alignas(16) int a;
_Alignof

用于获取对齐方式。

示例

_Alignof(int);
_Atomic

用于定义原子类型,保证操作的原子性。

示例

_Atomic int atomicVar;
_Bool

用于定义布尔类型。

示例

_Bool flag = 1;
_Complex

用于定义复数类型。

示例

_Complex double z = 1.0 + 2.0i;
_Generic

用于定义泛型选择器,根据表达式的类型选择对应的表达式。

示例

_Generic(x, int: "int", float: "float");
_Imaginary

用于定义虚数类型。

示例

_Imaginary float y = 1.0i;
_Noreturn

用于定义无返回值类型的函数,表示该函数不返回到调用者。

示例

_Noreturn void exit(int);
_Static_assert

用于定义静态断言,在编译时进行条件检查。

示例

_Static_assert(sizeof(int) == 4, "int size");
_Thread_local

用于定义线程局部存储,变量在每个线程中有独立的副本。

示例

_Thread_local int tlVar;

4. 总结

通过上述对比和解释,我们可以看出 C51 和标准 C 语言在关键字上的差异。C51 添加了一些特定的关键字,以便更高效地进行硬件控制和内存管理,而标准 C 语言则更通用,适用于更广泛的平台和应用。了解这些差异有助于程序员在不同平台和项目中更好地选择和使用编程语言。

5. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对C51和标准C关键字区别有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持点我关注❤️

相关文章:

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值