keilC51明明已经定义的变量却报错未定义与期待asm

2024-03-12 23:04

本文主要是介绍keilC51明明已经定义的变量却报错未定义与期待asm,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • keil_C51采用的是C89标准:
    • C89变量定义标准:
    • 程序块:
  • expected '__asm':
  • 已经定义某个变量却报错未定义该变量:
    • 从汇编语言中看:

keil_C51采用的是C89标准:

C89变量定义标准:

1. 变量定义位置: 在C89标准中,所有局部变量必须在函数或块的开头定义。这意味着在定义好变量之前不能有其他的执行语句,如scanf或其他函数调用。
2. 变量声明与定义: 在C89中,变量的声明和定义通常是一起进行的。也就是说,当你声明一个变量时,你也必须指定它的类型,并进行初始化(如果需要的话)。
3. 变量作用域: 在C89中,变量的作用域是从定义它的点开始,直到包含它的块或函数结束。如果变量在函数内部定义,那么它的作用域就是该函数内部。
4. 变量存储类别: C89提供了几种变量存储类别,如auto(自动变量,默认)、extern(外部变量)、static(静态变量)和register(寄存器变量)。这些关键字用于指定变量的存储方式和生命周期。
5. 变量初始化: 在C89中,局部变量如果没有显式初始化,它们的初始值是未定义的。这意味着在使用这些变量之前,必须确保它们已经被正确初始化。
6. 命名规则: 变量名必须遵循一定的命名规则,如首字符必须是字母或下划线,不能使用汉语拼音,不能与关键字及系统预定义的标识符相同等。

程序块:

  • 在计算机科学和编程中,程序块(也称为代码块、语句块或块)通常指的是一组一起执行的语句。这些语句通常被包含在某种类型的结构或控制流语句中,如循环、条件语句(如if-else)、函数或方法定义等。

程序块的主要特点包括:
1. 局部性: 块内的变量和常量只在块内部可见。这有助于封装和组织代码,同时减少潜在的命名冲突。
2. 控制流: 块允许程序员控制程序的执行流程。例如,循环块允许重复执行一组语句,直到满足某个条件为止;条件块则允许根据特定条件执行不同的代码路径。
3. 作用域: 块定义了变量的作用域。在块内部声明的变量在块外部是不可见的,除非这些变量被声明为全局变量或具有其他特殊的可见性属性。

expected ‘__asm’:

原因: 变量定义的位置不是在程序块的开头。
在这里插入图片描述
解决办法: 根据C89标准,只需要将变量定义放在程序快的开头或者将它定义为全局变量。

已经定义某个变量却报错未定义该变量:

在这里插入图片描述
原因: C89标准中,局部变量的生存周期仅在它所被定义的程序块呢,图片中,position是在if语句的程序块内被定义的,所以只有if的花括号内这个变量存在。

从汇编语言中看:

在这里插入图片描述

  • 我分别在if和while的程序块内定义了position_1和position_2,调试之后可以看到,在一开始程序把0x01这个地址分给了position_1,然后出了if语句之后进入到while的程序块内,又将0x01这个地址分给了position_2,也就是说出了if语句之后position_1的内存就被回收了,它就不存在了。

这篇关于keilC51明明已经定义的变量却报错未定义与期待asm的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802866

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

MySQL报错sql_mode=only_full_group_by的问题解决

《MySQL报错sql_mode=only_full_group_by的问题解决》本文主要介绍了MySQL报错sql_mode=only_full_group_by的问题解决,文中通过示例代码介绍的非... 目录报错信息DataGrip 报错还原Navicat 报错还原报错原因解决方案查看当前 sql mo

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja