本文详细介绍了C语言中的宏定义,包括无参宏与带参宏的定义方式及使用注意事项,探讨了宏定义中的特殊符号#与##的功能,并举例说明如何正确使用宏定义来简化编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译[1]

参数

不带参数

宏定义又称为宏代换、宏替换,简称“宏”。
格式:
#define 标识符 字符串
其中的标识符就是所谓的符号常量,也称为“宏名”。
预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。
掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。
即在对相关命令或语句的含义和功能作具体分析之前就要换:
把程序中出现的Pi全部换成3.1415926
说明
(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
(4)宏定义末尾不加分号;
(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
(6)可以用#undef命令终止宏定义的作用域
(7)宏定义允许嵌套
(8)字符串" "中永远不包含宏
(9)宏定义不分配内存,变量定义分配内存。
(10)宏定义不存在类型问题,它的参数也是无类型的。[2]

带参数

除了一般的字符串替换,还要做参数代换
格式
#define宏名(参数表) 字符串
例如#define S(a,b) a*b
area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;
类似于函数调用,有一个哑实结合的过程:
(1)实参如果是表达式容易出问题
#define S(r) r*r
area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;
正确的宏定义是#define S(r) ((r)*(r))
(2)宏名和参数的括号间不能有空格
(3)宏替换只作替换,不做计算,不做表达式求解
(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存
(5)宏的哑实结合不存在类型,也没有类型转换。
(6)函数只有一个返回值,利用宏则可以设法得到多个值
(7)宏展开使源程序变长,函数调用不会
(8)宏展开不占运行时间,只占编译时间函数调用占运行时间(分配内存、保留现场、值传递、返回值)[3]

3冷门重点

#define用法
1、 用无参宏定义一个简单的常量
#define LEN 12
这个是最常见的用法,但也会出错。
比如下面几个知识点你会吗?可以看下:
(1)#define NAME "zhangyuncong"
程序中有"NAME"则,它会不会被替换呢?
(2)#define 0x abcd
可以吗?也就是说,可不可以用不是标识符的字母替换成别的东西?
(3)#define NAME "zhang
这个可以吗?
(4)#define NAME "zhangyuncong"
程序中有上面的宏定义,并且,程序里有句:
NAMELIST这样,会不会被替换成"zhangyuncong"LIST
四个题答案都是十分明确的。
第一个,""内的东西不会被宏替换。这一点应该大都知道。
第二个,宏定义前面的那个必须是合法的用户标识符
第三个,宏定义也不是说后面东西随便写,不能把字符串的两个""拆开。
第四个:只替换标识符,不替换别的东西。NAMELIST整体是个标识符,而没有NAME标识符,所以不替换。
也就是说,这种情况下记住:#define第一位置第二位置
(1) 不替换程序中字符串里的东西。
(2) 第一位置只能是合法的标识符(可以是关键字)
(3) 第二位置如果有字符串,必须把""配对。
(4) 只替换与第一位置完全相同的标识符
还有就是老生常谈的话:记住这是简单的替换而已,不要在中间计算结果,一定要替换出表达式之后再算。
2、 带参宏一般用法
比如#define MAX(a,b) ((a)>(b)?(a):(b))
则遇到MAX(1+2,value)则会把它替换成:
((1+2)>(value)?(1+2):(value))
注意事项和无参宏差不多。
但还是应注意
#define FUN(a) "a"
则,输入FUN(345)会被替换成什么?
其实,如果这么写,无论宏的实参是什么,都不会影响其被替换成"a"的命运。
也就是说,""内的字符不被当成形参,即使它和一模一样。
那么,你会问了,我要是想让这里输入FUN(345)它就替换成"345"该怎么实现呢?
请看下面关于#的用法
3、 有参宏定义中#的用法
#define STR(str) #str
#用于把宏定义中的参数两端加上字符串的""
比如,这里STR(my#name)会被替换成"my#name"
一般由任意字符都可以做形参,但以下情况会出错:
STR())这样,编译器不会把“)”当成STR()的参数。
STR(,)同上,编译器不会把“,”当成STR的参数。
STR(A,B)如果实参过多,则编译器会把多余的参数舍去。(VC++2008为例)
STR((A,B))会被解读为实参为:(A,B),而不是被解读为两个实参,第一个是(A第二个是B)。
4、 有参宏定义中##的用法
#define WIDE(str) L##str
则会将形参str的前面加上L
比如:WIDE("abc")就会被替换成L"abc"
如果有#defineFUN(a,b) vo##a##b()
那么FUN(id ma,in)会被替换成void main()
5、 多行宏定义:
#define doit(m,n) for(int i=0;i<(n);++i)\
{\
m+=i;\
}

<think>嗯,用户想通过FileZilla连接飞牛NAS设备。首先,我需要回忆一下FileZilla的基本配置步骤,以及飞牛NAS可能需要的设置。根据之前的引用资料,FileZilla支持SFTP协议,默认端口是22。但飞牛NAS可能有不同的配置,所以得确认一下他们的默认端口是否正确。 然后,用户可能需要安装FileZilla客户端。引用[1]提到了官网下载地址,应该先指导用户下载并安装。接下来是配置连接参数,比如主机名、端口、协议类型、用户名和密码。根据引用[2]和[3],使用SFTP协议连接群晖或Linux服务器时,端口是22,但不确定飞牛NAS是否相同。可能需要用户查看飞牛NAS的文档,或者默认使用22端口,如果不行再调整。 另外,引用[5]提到连接建立但无法显示目录的问题,可能是防火墙或权限问题。在教程里应该提醒用户检查这些方面。比如,确保NAS的SSH服务开启,防火墙允许22端口,以及用户是否有访问权限。此外,可能需要生成SSH密钥对,特别是如果飞牛NAS要求密钥认证的话,如引用[3]中的设置root密码步骤,但这里可能涉及密钥配置。 还需要考虑是否需要被动模式设置,但根据引用[5],被动模式可能涉及更多服务器配置,所以暂时先建议用户使用主动模式,或者根据实际情况调整。另外,连接后的文件输步骤也是必要的,比如如何上下载文件,确保用户知道基本操作。 可能的问题包括连接失败、认证错误、目录不显示等,需要给出对应的解决方法。比如检查IP和端口是否正确,确认服务开启,以及用户权限是否足够。还要提醒用户如果使用公网IP,可能需要配置DDNS或端口转发,如引用[2]中提到的公网环境连接群晖的情况。 最后,生成相关问题,比如如何排除连接问题,优化输速度,或者与其他NAS系统的区别。这些能帮助用户进一步了解相关知识点。</think>### 通过FileZilla连接飞牛NAS的详细教程 #### 一、准备工作 1. **下载安装FileZilla客户端** 访问官网下载地址:[FileZilla客户端下载页面](https://filezilla-project.org/download.php?type=client),点击“Download FileZilla Client”完成安装[^1]。 2. **确认飞牛NAS的网络配置** - 确保飞牛NAS已开启SSH/SFTP服务(默认端口通常为22)。 - 若通过公网连接,需配置DDNS或公网IP,并在路由器中设置端口转发(例如将外部22端口映射到NAS的22端口)[^2]。 --- #### 二、连接步骤 1. **打开FileZilla客户端** 点击顶部菜单栏的“文件” → “站点管理器” → “新站点”。 2. **填写连接参数** - **协议**:选择 `SFTP - SSH File Transfer Protocol`(飞牛NAS一般使用SFTP协议)[^3] - **主机**:输入飞牛NAS的IP地址(局域网IP或公网IP/DDNS域名) - **端口**:默认22,若NAS自定义端口则需修改 - **登录类型**:选择“正常” - **用户**:输入NAS的登录用户名(如`admin`) - **密码**:输入对应用户的密码 ```plaintext 示例配置: 协议: SFTP 主机: sftp://fnas.example.com 或 192.168.1.100 端口: 22 用户: admin 密码: ******** ``` 3. **连接与验证** - 点击“连接”,首次连接会提示SSH密钥确认,勾选“始终信任此主机”后确认[^4] - 成功连接后,右侧“远程站点”窗口会显示NAS的目录结构。 --- #### 三、常见问题解决 1. **连接失败** - 检查NAS的SSH/SFTP服务是否启用。 - 确认防火墙或路由器未阻止22端口(公网需配置端口转发)[^2]。 - 若提示“Connection timed out”,可能是IP地址或端口错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值