精华内容
下载资源
问答
  • 留“默认”就可以)
    wps 干的坏事
    

    1 regedit

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace

    2 删除该位置下的所有值,或者你认为可以删除的值(只留“默认”就可以)
    展开全文
  • 一、什么是名字空间? C++中对函数、变量、类型进行逻辑上的划分,避免同名的标识符重定义。 当我们在处理非常庞大复杂的项目时,不可避免地需要多人共同合作,可是人一多,取出来的名字难免重复,于是就会发生重...

    一、什么是名字空间?

    C++中对函数、变量、类型进行逻辑上的划分,避免同名的标识符重定义。
    当我们在处理非常庞大复杂的项目时,不可避免地需要多人共同合作,可是人一多,取出来的名字难免重复,于是就会发生重定义的错误,而名字空间很好地帮我们避免了这个问题。

    二、名字空间的使用

    1.语法

    namespace 名字空间名{
    //变量
    //函数
    //类型

    }
    C++中名字空间名相同,表示它们是同一个名字空间,同名的名字空间里的内容划分为同一个逻辑单元,会自动合并;
    名字空间相当于有隔离的作用,即外部不能直接访问名字空间中的变量、函数、类型。
    例如:

    //名字空间是对代码进行逻辑划分
    namespace ZhangSan{
    	int a;
    	void fun(){
    		cout << "Hello A " << a <<endl;	
    	}
    	struct Stu{
    		int id;
    		char name[24];
    	};
    }
    //名字空间同名  表示是同一个名字空间的内容
    namespace ZhangSan{
    	int b;
    	void show(){
    		cout << "Show B " << b << endl;	
    	}	
    }
    

    在名字空间中声明结构体:

    namespace LiSi{
    	int a;
    	void fun(){
    		cout << "Hi A " << ZhangSan::a << ":" << a << endl;	
    	}
    	struct Stu{
    		int id;
    		char name[24];
    	};
    }
    

    2、名字空间的访问

    访问指定名字空间中的标识符
    名字空间名::标识符
    例如:
    std::cout
    std::endl
    std::cin

    声明名字空间中的内容对于当前作用域可见 :

    int main(){
    	//对于名字空间声明的外部  不能直接访问名字空间中的内容
    	//a = 100;这样是访问不到的
    	ZhangSan::a = 100;
    	LiSi::a = 200;
    	ZhangSan::fun();
    	LiSi::fun();
    	ZhangSan::Stu s;
    	LiSi::Stu s1;
    	return 0;	
    }
    

    3、名字空间的作用域

    1、using namespace 名字空间;
    声明名字空间中的内容对于当前作用域可见 (注意:仅仅是可见,不是拷贝!)
    可以放在全局 也可以 放在函数中
    在全局域使用using namespace 名字空间时:在全局域不能直接访问该名字空间中的变量及直接调用函数,只允许访问类型
    名字空间 中所有的内容可以直接使用
    例如:
    using namespace std;
    cout
    endl
    cin
    因为只是表示在当前区域可见,所以反复表示可见时可以的,不会报错:

    #include <iostream>
    //using namespace std;
    
    namespace ZhangSan{
    	int a;
    	void fun(){
    		std::cout << "Hello A " << a << std::endl;	
    	}
    	struct Stu{
    		int id;
    		char name[24];
    	};
    }
    
    using namespace ZhangSan;//表示可见一次
    //ZhangSan名字空间中的内容对当前作用域可见
    //a = 200;
    Stu s={1,"张三"};
    //fun();
    int main(){
    	using namespace ZhangSan;//表示可见两次
    	using namespace ZhangSan;//表示可见三次
    	std::cout << "Hello " << std::endl;
    	a = 100;
    	fun();
    	Stu s = {110,"张三"};
    	using std::cout;
    	using std::endl;
    	cout << "Hello cout" << endl;
    	return 0;	
    }
    
    

    声明多个名字空间对当前作用域可见时,如果名字空间中同名的标识符,依然不能直接使用

    using namespace A{
    	int x;
    }
    using namespace B{
    	int x;
    }
    	
    int main(){
    	A::x = 10;
    	B::x = 20;
    	using namespace A;
    	cout << x << endl;
    	using namespace B;
    		
    		x  //有歧义  会报错
    		cout << A::x << endl;
    		cout << B::x << endl;
    }
    

    2、 using 名字空间::内容;
    把名字空间中的内容直接导入到当前作用域
    导入的内容相当于直接在当前作用域声明和定义的一样了
    例如:
    using std::cout;
    using std::endl;
    注意:这种做法相当于声明,如果内容重名,会重定义:

    #include <iostream>
    using namespace std;
    
    namespace A{
    	int a;
    	void print(int x){
    		cout << "A:" << x << endl;
    	}
    }
    
    namespace B{
    	double a;
    	void print(double x){
    		cout << "B:" << x << endl;	
    	}
    }
    
    int main(){
    	A::a = 1;
    	B::a = 3.14;
    	A::print(10);
    	B::print(10);
    	using namespace A;
    	cout << a << endl;
    	print(119);//119
    	print(3.14);//3
    	using namespace B;
    	//cout << a << endl;//出错  有歧义 因为A、B名字空间中的a都可见
    	cout << A::a << endl;
    	cout << B::a << endl;
    	print(119);//119
    	print(3.14);//3.14
    	using A::a;//把A::a导入到当前作用域
    	cout << a << endl;//局部优先  同名时默认访问当前作用域的
    	cout << B::a << endl;
    	//using B::a;//错误  同一个作用域不能有同名的变量
    	using A::print;//把A::print函数导入到当前作用域
    	print(119);//局部优先原则
    	print(3.14);//局部优先原则
    	using B::print;
    	print(119);
    	print(3.14);
    	return 0;	
    }
    
    

    函数和常量在C++语法中有本质区别,函数名字相同并不会语法重定义,该语法在之后的内容中会进行解释。

    4、访问全局变量

    定义在全局的变量、函数、类型会自动归并到 无名 名字空间里面;
    如果需要访问同名的全局变量需要 ::标识符 否则直接访问的只能是局部变量

    #include <iostream>
    using namespace std;
    
    namespace A{
    	int x;	
    }
    
    //定义在全局的变量、函数、类型 自动归并到  无名名字 空间里面
    int x;
    
    int main(){
    	int x;
    	x = 110;
    	cout << x << endl;
    	A::x = 120;
    	cout << A::x << endl;
    	::x = 111;//访问全局变量中与局部变量同名的变量
    	cout << ::x << endl;
    	using namespace A;
    	cout << x << endl;//局部优先
    	//using A::x;
    	cout << x << endl;
    	return 0;	
    }
    

    局部变量隐藏全局变量 或者 隐藏其它名字空间中的同名变量
    但如果通过 using 名字空间::标识符 导入到当前作用域 就要确定不能 名字相同(函数暂时除外);

    5、名字空间的嵌套

    #include <iostream>
    using namespace std;
    
    namespace A{
    	int a;
    	namespace B{
    		int b;
    		namespace C{
    			int c;	
    		}
    	}
    }
    
    int main(){
    	A::a = 1;
    	A::B::b = 2;
    	A::B::C::c = 3;
    	using namespace A;
    	cout << a << endl;
    	using namespace B;
    	cout << b << endl;
    	return 0;	
    }
    

    6、多文件编程

    在.h文件中

    namespace NS{
    	void fun();
    	int gongYue(int m,int n);
    }
    

    在.cpp实现文件中:

    void NS::fun(){
    }
    int NS::gongYue(int m,int n){
    	//函数实现
    }
    
    

    实现结构体中的函数:

    #include "tstruct.h"
    /*
    namespace NT{
    	struct Stu{
    		int no;
    		char name[24];
    		int age;
    		void show();
    	};
    	void print(Stu s);
    }
    */
    
    //函数返回值类型  名字空间::结构体类型::成员函数(参数列表){}
    void NT::Stu::show(){
    	cout << no << ":" << name << ":" << age << endl;	
    }
    void NT::print(Stu s){
    	cout << s.no << ":" << s.name << ":" << s.age << endl;	
    }
    
    
    
    展开全文
  • 了解并掌握无名管道及有名管道; 重点是对基础及概念的把握; (非)阻塞写(读)打开规则; 读规则,写规则;
  • 51-无名管道

    千次阅读 2017-01-03 18:43:13
    这种方式简单而又强大,尤其适合亲缘关系的进程(通常是父子进程)间通信了。实际上,你或多或少的都用过管道这种通信方式,比如你在使用的 linux 命令中的管道连接符 |。所以,对于管道来说,你应该一种亲切感...

    这恐怕是最古老的 linux 进程间通信的方式了。这种方式简单而又强大,尤其适合有亲缘关系的进程(通常是父子进程)间通信了。

    实际上,你或多或少的都用过管道这种通信方式,比如你在使用的 linux 命令中的管道连接符 |。所以,对于管道来说,你应该有一种亲切感。

    1. 管道为何物?

    如果你实践过前面我们讲过的使用本地文件进行进程间通信的方式,那么你就可以把管道理解成位于进程内核空间(如果你不记得这个概念,请翻阅前面的博文)的“文件”。


    这里写图片描述
    图1 假想的位于内核的管道文件

    给文件加引号,是因为它和文件确实很像,因为它也有描述符。但是它确实又不是普通的本地文件,而是一种抽象的存在。

    当进程使用 pipe 函数,就可以打开位于内核中的这个特殊“文件”。同时 pipe 函数会返回两个描述符,一个用于读,一个用于写。如果你使用 fstat函数来测试该描述符,可以发现此文件类型为 FIFO.

    而无名管道的无名,指的就是这个虚幻的“文件”,它没有名字。

    本质上,pipe 函数会在进程内核空间申请一块内存(比如一个内存页,一般是 4KB),然后把这块内存当成一个先进先出(FIFO)的循环队列来存取数据,这一切都由操作系统帮助我们实现了。

    2. pipe 函数

    • 函数原型
    int pipe(int pipefd[2]);

    pipe 函数打开的文件描述符是通过参数(数组)传递出来的,而返回值表示打开成功(0)或失败(-1)。

    它的参数是一个大小为 2 的数组。此数组的第 0 个元素用来接收以的方式打开的描述符,而第 1 个元素用来接收以的方式打开的描述符。也就是说,pipefd[0] 是用于读的,而 pipefd[1] 是用于写的。

    打开了文件描述符后,就可以使用 read(pipefd[0]) 和 write(pipefd[1]) 来读写数据了。

    • 注意事项

    这两个分别用于读写的描述符必须同时打开才行,否则会出问题。

    1. 如果关闭读 (close(pipefd[0])) 端保留写端,继续向写端 (pipefd[1]) 端写数据(write 函数)的进程会收到 SIGPIPE 信号。
    2. 如果关闭写 (close(pipefd[1])) 端保留读端,继续向读端 (pipefd[0]) 端读数据(read 函数),read 函数会返回 0.

    3. 用 pipe 进行进程间通信

    当在进程用 pipe 函数打开两个描述符后,我们可以 fork 出一个子进程。这样,子进程也会继承这两个描述符,而且这两个文件描述符的引用计数会变成 2。(如果忘记了这个特性,请复习《fork 函数与文件共享》

    如果你需要父进程向子进程发送数据,那么得把父进程的 pipefd[0] (读端)关闭,而在子进程中把 pipefd[1] 写端关闭,反之亦然。为什么要这样做?实际上是避免出错。传统上 pipe 管道只能用于半双工通信(即一端只能发,不能收;而另一端只能收不能发),为了安全起见,各个进程需要把不用的那一端关闭(本质上是引用计数减 1)。

    图2 和图 3 演示了上述过程。

    • 步骤一:fork 子进程


      这里写图片描述
      图2 fork 后的半双工管道

    • 步骤二:关闭父进程读端,关闭子进程写端


      这里写图片描述
      图3 从父进程到子进程的管道

    要想实现全双工通信(既能发又能收)怎么办?你可以再使用 pipe 打开两个描述符,或者使用其它的 ipc 手段。

    接下来,看实例。

    4. 实例

    下面的程序功能如下:父进程 fork 出一个子进程,通过无名管道向子进程发送字符,子进程收到数据后将字符串中的小写字符转换成大写并输出。

    为了突显程序结构,删除了错误处理部分的代码。

    • 代码
    // hellopipe.c
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    void child(int *fd) {
      close(fd[1]); // 子进程关闭写端
      char buf[64];
      int n = 0,i;
    
      while(1) {
        n = read(fd[0], buf, 64); // 如果没有数据可读,read 会阻塞;如果父进程退出,read 返回 0.
        for (i = 0; i < n; ++i) putchar(toupper(buf[i]));
        if (*buf == 'q') {
          close(fd[0]);
          exit(0);
        }   
        if (n == 0) {
          puts("no data to read!");
          sleep(1);
        }   
      }
      exit(0);  
    }
    
    int main() {
      int fd[2];
      int n = 0;
      char buf[64] = { 0 };
      if (pipe(fd) < 0) {
        perror("pipe");
        return -1; 
      }
    
      pid_t pid = fork();
      if (pid == 0) {
        child(fd);
      }
    
      close(fd[0]);// 父进程关闭读端
      while (1) {
        n = read(STDIN_FILENO, buf, 64); 
        write(fd[1], buf, n); 
        if (*buf == 'q') {      
          close(fd[1]);
          exit(0);
        }   
      }
    
      return 0;
    }
    • 编译和运行
    $ gcc hellopipe.c -o hellopipe
    $ ./hellopipe
    • 运行结果
    hello world // 输入
    HELLO WORLD // 输出
    24215lkjl // 输入
    24215LKJL // 输出

    5. 总结

    • 掌握 pipe 函数
    • 理解 pipe 函数原理(fifo 队列)

    练习:在运行上面的程序时,分别 kill 父进程和子进程,看看有什么结果,并解释现象。

    展开全文
  • linux 之 无名管道

    2020-11-01 20:36:27
    管道的主要功能就是在不同进程中间完成数据传输工作。...特殊文件(没有名字),那当然无法使用open() ,但是可以使用close() 。 只能通过子进程继承文件描述符的方式来使用无名管道进行数据的传输。 write() 和 rea

    管道的主要功能就是在不同进程中间完成数据传输工作。

    pipe() 函数

    头文件

    #include<unistd.h>

    函数原型

    int pipe(int pipefd[2]);
    //参数为文件描述符数组,无名管道的读写描述符就存于此。
    //在文件中通过这两个文件描述符进行数据传输。

    返回值
    成功:0
    失败:-1

    特点

    • 特殊文件(没有名字),那当然无法使用open() ,但是可以使用close() 。
    • 只能通过子进程继承文件描述符的方式来使用无名管道进行数据的传输。
    • write() 和 read() 可能会阻塞进程。
      read时,无名管道内没有数据,那么read会阻塞进程,直到无名管道有数据。
      write向无名管道写数据时,无名管道的缓存区已经写满了,write函数所对应的进程就无法往无名管道里写程序,阻塞进程。直到无名管道的缓存区的数据被读走了之后,才能写。缓存区有任意的空间,write()就不会阻塞,直接写入。
    • 所有的文件描述符被关闭后,无名管道被销毁。如,父进程、子进程中都有两个文件描述符,这四个文件描述符都被关闭以后,无名管道才会被销毁。

    使用步骤

    • 父进程调用pipe()函数,创建无名管道,并把管道的文件描述符记录在进程的文件描述符表里面。
    • 父进程里面调用fork()函数,创建子进程。子进程会把上面父进程的文件描述表继承过来。
    • 关闭无用端口,写的时候打开写文件描述符,关闭读文件描述符;读的时候相反。一般不会在一个进程里面同时打开读写两个文件描述符。
    • 调用read() 或者 write() 读写端口。
    • close() 关闭读写端口。

    测试代码

    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/wait.h>
    #include<errno.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define 	MAX_DATA_LEN	256
    
    int main()
    {
    	pid_t pid;
    	int pipe_fd[2];
    	int status;
    	char buf[MAX_DATA_LEN];
    	const char data[] = "Pipe test program";
    	int real_read,real_write;
    	
    	memset((void *)buf,0,sizeof(buf));
    	//创建管道
    	if(pipe(pipe_fd) < 0)
    	{
    		printf("Pipe create error.\n");
    		exit(1);
    	}
    	//创建一个子进程
    	if((pid = fork()) == 0)
    	{
    		//子进程关闭写描述符
    		close(pipe_fd[1]);
    		//子进程读取管道内容
    		//如果无名管道里没有内容,read将该子进程阻塞在此处
    		if((real_read = read(pipe_fd[0],buf,MAX_DATA_LEN)) > 0)
    		{
    			printf("%d bytes read from the pipe,it is '%s'\n",real_read,buf);
    		}
    		close(pipe_fd[0]);
    		exit(0);
    	}
    	else if(pid > 0)
    	{
    		//父进程关闭描述符
    		close(pipe_fd[0]);
    		if((real_write = write(pipe_fd[1],data,strlen(data))) != -1)
    		{
    			printf("Parent write %d bytes : %s\n",real_write,data);
    		}
    		//关闭父进程描述符
    		close(pipe_fd[1]);
    		//收集子进程退出信息
    		//阻塞等待子进程退出,子进程调用了exit(0)之后
    		wait(&status);
    		exit(0);
    	}
    }

    程序运行结果

    jl@jl-virtual-machine:~/test/11_1$ 
    jl@jl-virtual-machine:~/test/11_1$ gcc pipe.c 
    jl@jl-virtual-machine:~/test/11_1$ 
    jl@jl-virtual-machine:~/test/11_1$ ls
    a.out  dd.c  pipe.c
    jl@jl-virtual-machine:~/test/11_1$ ./a.out 
    Parent write 17 bytes : Pipe test program
    17 bytes read from the pipe,it is 'Pipe test program'
    jl@jl-virtual-machine:~/test/11_1$ 
    

    测试成功!

    展开全文
  • 特点 - 特殊文件(没有名字),无法使用open,但是可以使用close。 - 只能通过子进程继承文件描述符的形式来使用 - write和read操作可能会阻塞进程 - 所有文件描述符被关闭之后,无名管道被销毁
  • C++无名命名空间详解

    2018-06-02 15:50:08
    namespace { int a;...其中$$$是在这个命名空间定义所在的作用域具有惟一性的名字,不同编译单位里无名命名空间互不相同 https://blog.csdn.net/y396397735/article/details/47835341 ...
  • 无名管道如下特点:1、半双工,数据在同一时刻只能在一个方向上流动。2、数据只能从管道的一端写入,从另一端读出。3、写入管道中的数据遵循先入先出的规则。4、管道所传送的数据是无格式的,这要求管道的读出方与...
  • 管道是一种特殊的文件,它不属于某一种文件系统,而是一种独立的文件系统,其自己的数据结构。根据管道的适用范围将其分为:无名管道和命名管道。●无名管道主要用于父进程与子进程之间,或者两个兄弟进程之间。在...
  • 在威斯敏斯特教堂地下室,英国圣公会主教的墓碑上写着这样的一段话:    当我年轻自由的时候,我的想象力没有任何局限,我梦想改变这个世界.当我渐渐成熟明智的时候,我发现这个世界是不可能改变的,于是我将...
  • window桌面出现无名空白文件,右键删除文件夹,再次刷新桌面还是会出现该文件夹。 解决办法: 1、右键该文件夹剪切到其他文件夹中,这是会报错,将报错信息(一串字符串)记下来,例如:{138508BC-1E03-49EA-9C8F-EA...
  • 无名namespace的作用

    千次阅读 2013-07-15 14:27:05
    以上介绍的是有名字的命名空间,C++还允许使用没有名字的命名空间,如在文件A中声明了以下的无名命名空间: namespace //命名空间没有名字 { void fun( ) //定 义命名空间成员 { cout } 由于命名空间...
  • 05·无名粉店(上)

    2021-03-11 10:49:47
    进门前,我往门头上一瞧,居然只得一块白板,只有招牌没有名字,也不知道说这老板是太自信还是太任性? 我走进去,里面空荡荡的,只摆着几张板凳桌椅,但桌面、地面擦的光可鉴人,异常的整洁干净,根本不像苍蝇饭馆...
  • win10桌面出现无名文件夹的解决方案

    万次阅读 多人点赞 2018-10-08 10:41:30
    解决方案如下: 1、右键点击该文件夹-剪切-粘贴到其他位置-出错-记下出错时提示的一长串类似于26EE0668-A00A-44D7-9371-BEB064C98683的字符; 2、win+R运行regedit,依次展开HKEY_LOCAL_MACHINE\SOFTWARE\...
  • 无名namespace

    2017-09-15 00:22:40
    在一个名字空间包含一系列的声明以便简单的保证可能发生的名字冲突是非常有用的。也就是说,名字空间的目的就是保证代码的本地化而不是给用户提供接口。例如: #include “cizi.h” namespace CIZI{ int a...
  • C++名字空间详解

    千次阅读 2018-04-25 14:41:32
    1.名字空间的由来名字空间(namespace)是由标准C++引入的,是一种新的作用域级别。原来C++标识符的作用域分为三级:代码块({…}和函数体)、类域和全局作用域。如今,在类作用域和全局作用域之间,C++标准又添加...
  • 1.C语言中使用typedef关键字来定义自己习惯的数据类型名称,也就是是为现有的类型取别名。 2.struct关键字能定义各种类型的集合...(指定一个无名结构体类型,显然不能再以次结构类型去定义变量,这种方式不常用) -
  • 简短的说一下 :首先创建一个文件夹   然后给文件重命名  将名字清空  光标会在空的文本框  这是按住Alt+0160  
  • 无名飞控

    千次阅读 2017-12-13 23:23:13
    无名飞控姿态数据的获得
  • 金庸笔下人物名字的来历和意义

    千次阅读 2019-08-20 17:07:50
    金庸老先生的取名艺术是非常值得我们学习的,今天跟踪公司项目,看到了一个同事的名字姓陆,想到了黄药师的徒弟陆乘风,又记得黄药师还有6个徒弟,但名字记不得了,所以搜了一下,发现大有乾坤,然后就对金庸小说中...
  • 无名管道、有名管道、信号通信 SYSEM V: (IPC对象) 消息队列、共享内存、信号灯集 BSD: 套接字通信 共享内存是所有进程间通信方式中效率最高的,因为它直接操作物理内存 信号通信是进程间通信方式中唯一的异步通信...
  • 文章目录Django之无名分组与有名分组的反向解析一、分组1、无名分组2、有名分组3、有名分组与无名分组能否混用?二、反向解析5 、反向解析(两种)1、后端反向解析2、前端反向解析6、无名分组、有名分组的反向解析1...
  • linux无名管道和有名管道

    万次阅读 多人点赞 2017-04-07 16:27:04
    1)无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。  单独构成一种独立的文件系统:管道对于管道两端的进程而...
  • 文章目录无名管道无名管道的创建 -- pipe函数无名管道的读写规律 无名管道 无名管道概述 管道(pipe)又称无名管道。 无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符。任何一个进程在创建的时候...
  • C++ 名字空间详解

    千次阅读 2015-08-29 18:45:25
    名字空间的由来名字空间(namespace)是由标准C++引入的,是一种新的作用域级别。原来C++标识符的作用域分为三级:代码块({…}和函数体)、类域和全局作用域。如今,在类作用域和全局作用域之间,C++标准又添加了...
  • 关于C++ 的无名对象

    千次阅读 2013-05-07 21:52:55
    结果是2,但是这个没有什么意义,没有创建有名字的对象,无法通过对象名调用类的函数接口进行操作。   无名对象大部分用于拷贝上,为了提高传递的效率 比如:A obj=A(2); 首先构造无名对象,此时会调用A...
  • Linux进程间通信之无名管道(三)1.无名管道概述2.无名管道创建和使用3.无名管道读写的特点4.参考代码5.建立管道和创建父子进程间的通信5.1.参考代码5.2.参考代码 1.无名管道概述 管道(pipe)又称无名管道。 无名管道...
  • enum没有枚举名字也可以

    千次阅读 2013-05-03 15:28:26
    那这种无名枚举什么作用?不用可以吗? 回答 用名的枚举相当于告诉你,以下枚举的变量属于哪个种类,比如枚举了星期一到星期日,然后给枚举一个名称星期,这样就告诉你枚举变量的都是星期几。可读性好...
  • docker删除无名镜像

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,396
精华内容 7,358
关键字:

名字里有无名的名字