基础知识复习一(Jun18)

·        变量的声明和定义

ü  声明是向编译器介绍名字--标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。

ü  告诉编译器,这个名字已经匹配到一块内存上,下面的代码用到变量或者对象是在别的地方定义的;告诉编译器,这个名字已经被预定了,别的地方再也不能用它来作为变量名或对象名。

ü  定义就是(编译器)创建一个对象,为这个对象分配一块内存,并给它取上一个名字,这个名字就是就是我们经常所说的变量名或对象名。

ü  定义创建对象并为这个对象分配了内存,声明没有分配内存。

ü  为什么要区分变量的声明和定义?主要是为了让多个文件可以访问同一个变量。

ü  一个变量的定义会为变量分配存储空间,也有可能同时为其提供初始值。

ü  声明则仅给出变量的数据类型和变量名称。

ü  变量的定义肯定也是变量的声明,反之则未必。

ü  在作用域内,变量的定义有且仅有一个,声明则可以有多个。

ü  有extern的时候,两者的情况区分:

 extern int i;    // 声明而不是定义,因为不分配存储空间。

extern int i = 1; //定义,因为分配了存储空间

ü  函数只有函数头是声明,有函数体是定义。

ü  类永远只是声明,类成员函数的函数体是定义。

ü  变量(非成员变量)和对象不加extern永远是定义。

ü  类中成员变量是声明。

·        全局变量:

ü 全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。其作用域是从定义该变量的位置开始至源文件结束。

ü 变量存储在全局数据区

ü  int a =0;//定义一个全局变量a,并给初值<===> extern int a = 0;

ü  extern int a;//声明一个全局变a

int a; //定义一个全局变量a

ü  当全局变量已经定义了,在其他文件中引用这个全局变量的时候,需要在新源文件用extern int a;申明一下。

·        extern:

ü  extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。需要用extern + 变量名或函数名加以申明。

ü  用来进行链接指定。C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况。C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。

·        Static:

ü  设定了数据的存储域:Static 局部变量存储在静态数据区,而普通局部变量存储在栈。Static 局部变量的作用域是从定义处开始,到程序结束; 普通变量是从定义去开始,到函数结束。

ü  限定了数据的作用域:Static 全局变量或函数,限定了他们的作用域只在本文件内。外部文件是无法看到的。所以可以在其他文件中定义相同的变量或函数。

ü  全局变量可以定义在可被多个.C文件包含的头文件中。在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

ü  static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文

ü  静态数据成员/成员函数:表示属于一个类而不是属于此类的任何特定对象的变量和函数。

ü  对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。

ü  静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。在Example 5中,语句intMyclass::Sum=0;是定义静态数据成员。

ü  静静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:

ü  <数据类型><类名>::<静态数据成员名>=<值>态数据成员和普通数据成员一样遵从public,protected,private访问规则。

ü  类的静态数据成员有两种访问形式:

ü  <类对象名>.<静态数据成员名><类类型名>::<静态数据成员名>

ü  如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员。

ü  静态数据成员主要用在各个对象都有相同的某项属性的时候。

ü  静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数

ü  类体外的静态数据成员定义和静态成员函数定义时不需要加static。

ü  静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数非静态成员函数可以任意地访问静态成员函数和静态数据成员静态成员函数不能访问非静态成员函数和非静态数据成员; 调用静态成员函数,可以用成员访问操作符(.)(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:

<类名>::<静态成员函数名>(<参数表>)

·        Register 

ü register称为寄存器变量。它只能用于整型和字符型变量。定义符register说明的变量被Turbo C2.0存储在CPU的寄存器中, 而不是象普通的变量那样存储在内存中, 这样可以提高运算速度。但是Turbo C2.0只允许同时定义两个寄存器变量,一旦超过两个, 编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量来处理。因此, 寄存器变量常用在同一变量名频繁出现的地方。 

ü  寄存器变量只适用于局部变量和函数的形式参数, 它属于auto型变量因此, 不能用作全程变量。定义一个整型寄存器变量可写成register int a; 

·        引用和指针的区别 

ü  引用必须初始化,而指针不必须。

ü  引用初始化后不能改变,而指针可以改变。

ü 引用不能赋值为空,而指针可以。

<think> 我们正在解决“media/jun不是个block device”的问题。根据错误信息,这通常发生在尝试挂载设备时,系统无法识别指定的路径为个块设备。 根据引用[1]:光盘设备称(块设备)(/dev/sr0)... 设备文件(如/dev/sr0)是块设备的访问入口。挂载设备需要指定个块设备文件和个挂载点目录。 错误信息中的“media/jun”看起来像是个目录路径(挂载点),而不是块设备路径。因此,问题可能在于我们在挂载命令中错误地将个目录当成了块设备来使用。 常见原因和解决步骤: 1. 确认要挂载的块设备是否存在: 使用命令 `lsblk` 或 `fdisk -l` 来列出当前系统中的块设备(如硬盘、光盘、U盘等)。确保你想要挂载的设备在列表中。 2. 检查设备文件: 块设备通常在`/dev/`目录下,例如:`/dev/sda1`、`/dev/sr0`等。确保你指定的设备文件存在。 3. 检查挂载命令: 挂载命令的正确格式是:`mount [选项] <设备> <挂载点>` 例如:`mount /dev/sr0 /media/cdrom` 注意:第个参数是设备文件,第二个参数是挂载点目录(必须存在)。 4. 确保挂载点目录存在: 如果挂载点目录不存在,需要先创建它。例如:`sudo mkdir /media/jun` 5. 检查设备类型: 错误信息中的“不是block device”表明你给的路径不是个块设备。请确认你给出的设备路径是否正确。例如,如果你尝试挂载的是光盘,设备可能是`/dev/sr0`;如果是U盘,可能是`/dev/sdb1`等。 6. 检查设备是否被识别: 有时设备可能没有被系统正确识别,可以尝试重新连接设备(如U盘、光盘等)或检查系统日志(`dmesg | tail`)来查看设备识别情况。 7. 检查设备是否已经挂载: 使用`mount`命令查看设备是否已经被挂载到其他位置。如果已经挂载,则无需重复挂载。 8. 文件系统支持: 确保系统支持该设备的文件系统。如果不支持,可能需要安装相应的内核模块。 具体步骤: 假设我们想要将个光盘(或ISO镜像)挂载到`/media/jun`目录: 步骤1:创建挂载点(如果不存在) sudo mkdir -p /media/jun 步骤2:查找设备 lsblk 例如,光盘设备可能是`/dev/sr0` 步骤3:挂载 sudo mount /dev/sr0 /media/jun 如果问题仍然存在,请检查设备是否已经准备好(例如,光盘是否放入光驱)。 如果遇到其他错误(例如文件系统类型不支持),可以尝试指定文件系统类型,例如: sudo mount -t iso9660 /dev/sr0 /media/jun 注意:iso9660是标准光盘文件系统。 另外,如果设备是U盘或移动硬盘,可能是其他文件系统(如vfat、ntfs、ext4等),需要相应地调整`-t`参数。 如果问题仍然无法解决,请提供更多上下文信息,例如你执行的命令和完整的错误信息。 根据引用[2]:虽然引用[2]是关于容器中nginx配置的,但我们可以忽略它,因为它与当前问题不直接相关。 因此,总结解决步骤: 1. 检查设备是否存在(使用`lsblk`)。 2. 确保挂载点目录存在(不存在则创建)。 3. 使用正确的块设备路径和挂载点执行挂载命令。 如果上述步骤不能解决问题,可能需要进步检查设备的状态(如是否被系统识别为块设备)以及设备是否损坏。 </think> ### 解决"media/jun不是个block device"问题的方法 该错误通常发生在尝试挂载设备时,系统无法识别指定路径为有效的块设备。以下是系统的解决步骤: #### 1. **确认块设备路径** - 运行 `lsblk` 或 `fdisk -l` 命令查看所有可用块设备: ```bash $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 96G 0 part / ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 4G 0 part [SWAP] sr0 11:0 1 1024M 0 rom ``` - **关键点**:块设备路径应为 `/dev/sdX` 或 `/dev/sr0` 格式,而不是目录路径[^1] #### 2. **检查挂载点有效性** - 确保挂载点目录存在: ```bash $ sudo mkdir -p /media/jun ``` - 验证目录权限: ```bash $ ls -ld /media/jun drwxr-xr-x 2 root root 4096 Jun 10 10:30 /media/jun ``` #### 3. **正确挂载命令** - 标准挂载语法: ```bash $ sudo mount /dev/sdXn /media/jun ``` - 示例(挂载光盘): ```bash $ sudo mount /dev/sr0 /media/cdrom ``` #### 4. **常见错误场景** | 错误场景 | 解决方案 | |---|---| | 将挂载点当作设备路径 | 使用 `/dev/` 下的物理设备路径 | | USB设备未识别 | 重新插拔设备后执行 `dmesg \| tail` | | 虚拟设备未初始化 | 检查虚拟机设置中的设备映射 | | 已挂载的设备 | 使用 `mount \| grep jun` 检查冲突 | #### 5. **进阶诊断** - 检测设备识别状态: ```bash $ udevadm info /dev/sr0 | grep ID_FS_TYPE ID_FS_TYPE=iso9660 ``` - 强制重扫SCSI设备: ```bash $ echo 1 > /sys/class/scsi_device/0\:0\:0\:0/device/rescan ``` **根本原因**:该错误通常源于混淆了**设备入口**(块设备路径)和**挂载点**(目录路径)。Linux要求挂载源必须是块设备文件(如 `/dev/sda1`),而挂载目标必须是空目录(如 `/media/jun`)[^1]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值