wildcard 的理解

原地址:http://www.groad.net/bbs/thread-2947-1-2.html    在此表示感谢


wildcard 用来明确表示通配符。因为在 Makefile 里,变量实质上就是 C/C++ 中的宏,也就是说,如果一个表达式如 objs = *.o ,则 objs 的值就是 *.o ,而不是表示所有的 .o 文件。若果要使用通配符,那么就要使用 wildcard 来声明 * 这个符号,使 * 符号具有通配符的功能。如下举例:

在当前目录下随意建立两个 *.c 文件,如 hello.c 和 world.c ,现在编写一个 Makefile 如下:
src = $(wildcard *.c /usr/src/linux-2.6.24/drivers/char/ip2/*.c)

all:
        @echo $(src)
运行输出:
# make
hello.c world.c /usr/src/linux-2.6.24/drivers/char/ip2/i2cmd.c /usr/src/linux-2.6.24/drivers/char/ip2/i2ellis.c /usr/src/linux-2.6.24/drivers/char/ip2/i2lib.c /usr/src/linux-2.6.24/drivers/char/ip2/ip2.mod.c /usr/src/linux-2.6.24/drivers/char/ip2/ip2base.c /usr/src/linux-2.6.24/drivers/char/ip2/ip2main.c /usr/src/linux-2.6.24/drivers/char/ip2/ip2main.mod.c
上面输出了当前目录下的两个 .c 文件以及/usr/src/linux-2.6.24/drivers/char/ip2/ 目录下所有的 .c 文件。

wildcard 也可以用来匹配变量。
比较以下几个代码(假设和 Makefile 文件同目录下已经有 include/config.mk 文件):
情况一
[Plain Text]  纯文本查看  复制代码
?
1
2
3
4
5
OBJTREE = /root/Makefile
src = $(wildcard $(OBJTREE)/include/config.mk)
 
all:
         @echo $(src)

输出:
# make
/root/Makefile/include/config.mk

情况二
[Plain Text]  纯文本查看  复制代码
?
1
2
3
4
5
OBJTREE = .
src = $(wildcard $(OBJTREE)/include/config.mk)
 
all:
         @echo $(src)

输出:
# make
./include/config.mk

情况三
[Plain Text]  纯文本查看  复制代码
?
1
2
3
4
5
OBJTREE = hello
src = $(wildcard $(OBJTREE)/include/config.mk)
 
all:
         @echo $(src)

输出:
# make
/*输出内容为空*/

对比上面 3 种情况可以看到,wildcard 也可以用来匹配变量,即这个变量可以是任意的情况。只是注意,wildcard 的核心是“匹配存在的文件”!像上面,将 OBJTREE 变量设为 hello ,当然是不可能找到 hello/include/config.mk 这个不存在的文件的,所以它的输出为空;而将正确的路径赋给 OBJTREE 时,它最后就能够正常的输出。
<think>好的,用户问的是关于编程或软件开发中的“wildcard”(通配符)的概念和用法。我需要先回忆相关知识,确保回答准确。 首先,通配符在不同的上下文中有不同的应用。比如在文件系统中,通配符如*和?用于匹配文件名;在正则表达式中,.可以代表任意字符;在泛型编程中,像Java的<?>用于类型参数的通配。这些都是不同的场景,需要分别解释。 接下来要确定用户可能需要的层次。作为新手,可能需要基础的解释和例子,而有经验的开发者可能更关注高级用法或特定语言的实现。但用户的问题比较广泛,应该覆盖常见的应用场景,并提供例子帮助理解。 需要检查引用资料是否有相关内容。用户提供的引用中,引用[1]提到异步编程,引用[2]是软件开发生命周期,引用[3]是Java代码示例,似乎没有直接相关的内容,所以可能不需要引用这些资料。但需要确保回答中的信息准确,可能需要依赖已有的知识。 然后,结构要清晰。分点说明不同场景下的通配符用法,每个部分给出定义、例子和应用场景。比如文件操作、正则表达式、泛型编程、数据库查询、网络配置等。 还要注意用户可能混淆的概念,比如通配符在正则表达式和文件系统中的区别,泛型中的上下界通配符等。需要明确区分这些差异,避免误解。 最后,生成相关问题,帮助用户进一步学习。问题应覆盖不同的应用领域,如文件系统、正则表达式、泛型、SQL、安全等,确保覆盖面广,同时引导深入探讨。 需要确保回答符合格式要求:行内公式用$...$,独立公式用$$...$$,但当前内容可能不涉及数学公式,但如果有涉及数学符号的地方要注意格式。例如,在正则表达式中,可能会提到类似.*的用法,需要用行内代码或LaTeX格式。 检查是否有错误,比如在Java泛型中,通配符的正确语法是<? extends T>和<? super T>,要确保正确无误。另外,SQL中的LIKE语句正确使用%和_的例子是否准确。 总结,回答应包括定义、不同场景的用法、示例代码或命令,以及相关应用,最后附上相关问题。确保语言简洁,用中文,结构清晰。</think>### Wildcard(通配符)的概念与用法 **Wildcard**(通配符)是编程和软件开发中用于表示模式匹配的特殊字符,通常用于模糊匹配字符串、文件名、类型参数等。其核心作用是简化对不确定或可变内容的操作。 --- #### 1. **文件系统与命令行中的通配符** - **定义**:在操作系统的文件路径或命令行中,通配符用于匹配符合特定模式的文件名。 - **常见符号**: - `*`:匹配任意长度字符(包括零个字符),例如 `*.txt` 匹配所有扩展名为 `.txt` 的文件。 - `?`:匹配单个字符,例如 `file?.log` 匹配 `file1.log`、`fileA.log` 等。 - **应用场景**:批量删除、复制文件,或在脚本中筛选文件[^1]。 --- #### 2. **正则表达式中的通配符** - **定义**:正则表达式(Regex)中,通配符用于匹配复杂的文本模式。 - **常见符号**: - `.`:匹配任意单个字符(除换行符外),例如 `a.c` 可匹配 `abc`、`a2c`。 - `.*`:匹配任意长度任意字符(贪婪模式)。 - **示例**:匹配邮箱地址的正则表达式 `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`[^2]。 --- #### 3. **泛型编程中的通配符** - **定义**:在支持泛型的语言(如 Java)中,通配符用于放宽类型限制。 - **语法**: - `<?>`:无界通配符,表示任意类型。 - `<? extends T>`:上界通配符,表示 `T` 或其子类。 - `<? super T>`:下界通配符,表示 `T` 或其父类。 - **示例**: ```java // 接受任何类型的 List void printList(List<?> list) { for (Object item : list) { System.out.println(item); } } ``` 此方法可处理 `List<String>`、`List<Integer>` 等类型[^3]。 --- #### 4. **数据库查询中的通配符** - **定义**:在 SQL 的 `LIKE` 语句中,通配符用于模糊查询。 - **常见符号**: - `%`:匹配零个或多个字符。 - `_`:匹配单个字符。 - **示例**:`SELECT * FROM users WHERE name LIKE 'J%';` 查询所有以 `J` 开头的用户名。 --- #### 5. **网络与安全中的通配符** - **SSL 证书**:通配符证书(如 `*.example.com`)用于保护同一主域名下的多个子域名。 - **防火墙规则**:通配符 IP 地址(如 `192.168.1.*`)用于匹配特定范围的 IP。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值