Clang Cling C+有多有用+;CERN开发的JIT解释器? 我最近看了一篇关于C++C++语言解释器的谷歌演讲。但我想知道,除了欧洲核子研究中心(CERN)的开发人员之外,是否还有人在使用Cling,从非对撞机物理科学家的角度来看,它有多好,你能用它编写桌面应用程序吗?

有一些与高能物理不同的使用案例的视频:(我认为第一对是相关的)有一些与高能物理不同的使用案例的视频:(我认为第一对是相关的)它可能非常有用,但它非常年轻。我找不到任何文档,没有专门的邮件列表,也没有在线教程。我能够运行小的玩具代码,但还不知道如何在大型库中高效地使用它 它可能非常有用,但它非常年轻。我找不到任何文档,没有专门的邮件列表,也没有在线教程。我能够运行小的玩具代码,但还不知道如何在大型库中高效地使用它 GRANG项目是一个成熟的项目。你可以在他们的官方网站上找到更多信息。他们也有一个

对于C+,Clang是否比gcc更具可移植性+;? 假设我有一个C++项目,我用GCC和CLAN编译它。您可以假设gcc编译版本在另一台linux机器上运行。这是否意味着(在正常情况下)clang版本也将在其他linux机器上运行?

linux程序取决于其构建环境。如果您的glibc版本或内核不同,那么有很多可能无法运行可执行文件。您可以使用llvm的解释器语言,它编译成字节码,可以在各种操作系统上进行解释。linux程序取决于它们的构建环境。如果您的glibc版本或内核不同,那么有很多可能无法运行可执行文件。不过,您可以使用llvm的解释器语言,它编译成字节码,可以在各种操作系统上进行解释。答案是,嗯,这取决于具体情况 第一个硬需求是相同的CPU架构。64位是不够的限定符。如果编译x64,那么在64位ARM上运行它不会有多

如何在Clang中获取调用方参数的源变量声明?

我对叮当声很陌生。如果这个问题听起来很傻,请原谅 我试图写一个简单的叮当声检查 我有一个简单的程序 void function(int a) { printf("%d", a); } main() { static int A = 0; //some computation //How to get the source of the variable declaration of A here? func(A);

Clang 叮当声[bcc32c警告]重新声明不应添加';dllexport';属性

我正在创建一个DLL并导出一个SimpleMAPI DLL函数,其中一个函数签名如下: extern“C”ULONG declspec(dllexport)WINAPI MAPISendMail(LHANDLE lhSession、ULONG PTR ulUIParam、lpMapiMessage lpMessage、FLAGS flFlags、ULONG ulReserved) 我使用C++ Builder,使用CLAN编译器。编译器问题警告: [bcc32c警告]:“MAPISendMail

Clang 叮当声;SPARC的LLVM构建

我正在写一个自我教育的小项目。它与叮当声和LLVM内部攻击有关。 但是当我调查代码库和阅读文档时,构建过程中发生了奇怪的事情 对于初学者,我尝试为SPARC目标构建LLVM和Clang。但这项相当简单的任务却很有挑战性 我使用稳定版本3.4.2中的源代码,文件夹树如下所示: llvm/ ... projects/ ... test-suite <-- test-suite-3.4.src.tar.gz extracted here t

Clang 是否可能';不改变标题?

我有一个LibTooling(timelag),用于为每个forstmt/whilestmt添加一个标志。我使用/timelag lalalala.cpp--在lalala.cpp中插入标志 不幸的是,此工具还将更改标头,甚至更改系统库 那么,是否有一些方法可以让LibTooling只处理输入文件?这里有两种可能性:如果使用RecursiveASTVisitor,可以使用SourceManager确定语句或声明的位置是否在主扩展文件中: clang::SourceManager &sm(

叮当链接错误:找不到库-lclang\u rt.builtins arm.a

我正在尝试使用clang构建ChibiOS,但目前我被困在下面的链接错误中。 链接build/ch.elf clang-7:警告:编译期间未使用参数:'-nostartfiles'[-Wunused命令行参数] /home/quest/clang_build/clang_all/build/bin/ld.lld:错误:找不到库-lclang_rt.builtins arm.a clang-7:错误:ld.lld命令失败,退出代码为1(使用-v查看调用) ../../../os/common/st

如何阻止Clang复制标准C头文件中的函数?

我有一些非常可爱的C99代码,它们是从多个.c文件编译而来的,当我使用Clang 2.7编译时,我会遇到一些非常奇怪的错误: /usr/include/bits/stdio.h:77: multiple definition of `putchar' a2test.o:/usr/include/bits/stdio.h:77: first defined here 所发生的事情是,的GNU libc头文件将某些函数(包括putchar)声明为extern\uuuuu inline\uuuu,出

更新Xcode 4.3以使用最新的Clang

如何配置Xcode 4.3.2以使用主干提示音(或比Xcode 4.3.2附带的提示音更晚的任何提示音)?使用与发布版捆绑在一起的Python脚本集Xcode analyzer。但请注意,这可能取决于您安装的Python版本:使用与上的版本捆绑在一起的Python脚本集xcode analyzer。但请注意,这可能取决于您安装的Python版本:

Clang 无法为if语句的那部分打印正确的行号,叮当

在下面的代码中,我使用ClangAPI解析C代码,然后尝试 1) 向代码中添加HTML页眉和页脚,以便在浏览器中查看 2) 获取IF语句的THEN部分的行号并打印它 我在(2)方面有困难。我无法理解输出的意义。对于以下输入(添加了行号),我得到的输出(相关)如下 电话号码是6 电话号码是6 电话号码是6 电话号码是6 电话号码是12 电话号码是12 电话号码是12 电话号码是12 我希望分别是4和8。有人能解释我错在哪里吗 我的输入如下(请删除行号或转到) %nl myinput.c 1#包

LLVM和Clang安装:apt get与手动安装

apt-get-method:我正在尝试在Ubuntu 15.10上安装LLVM和Clang。我使用了命令sudo-apt-get-install-llvm和sudo-apt-get-install-clang。这似乎奏效了,只花了几分钟 手动方法:然而,大多数在线说明都让我手动下载并构建LLVM和Clang包(例如,请参见此处:)。我知道这种方法可能需要一些时间,甚至需要几个小时来构建LLVM和Clang 这两种方法有什么区别?它们相等吗?我只是想确保所有的东西都安装正确。(我的背景是Wind

Clang Can';t link libFuzzer.a使用与libc++;

我正在尝试将以下内容链接在一起: libFuzzer.a,使用clang++-5.0和-std=c++11 我的fuzz驱动程序,用clang++-5.0和-std=c++11-stdlib=libc++ libcurl,用clang-5.0编译 具体而言,正在执行此链接器命令: /bin/bash../../libtool--silent--tag=CXX--mode=link clang++-5.0-I../../include-I../../lib-I../../lib-I../../

Clang 将callExpr.getArg类型强制转换为decl

我想实现一个基于Clang的解释器。我遇到了一个问题。我创建一个map来存储vardecl及其对应的int值。但是当我访问callExpr时,函数callExpr.getArg的返回类型是expr,我想将其强制转换为decl类型。我怎样才能解决这个问题 范例 int a = 10; int main(){ PRINT(a) //self-define function } mymapdecl[a]=10,但PRINTExpr.getArg类型为expr。 我使用dyn\u cast(左)获

Clang 如何检查Decl是否在#if指令的范围内?

我正在制作一个叮当作响的libtool, 我如何获得预处理器信息来告诉我给定的Decl是否在#if#ifdef#ifndef的范围内?不幸的是,没有简单的答案。Clang在AST级别并不完全了解任何预处理器指令 据我所知,您所能做的最好的事情就是实现一个PPCallbacks类,向编译器实例预处理器注册它,并实现If、Elif、Endif的函数 然后,您可以使用ASTVisitor查找这些源位置之间的所有内容

Clang 获取llvm中局部变量的实际值

如果我有这个例子: int a=0, b=0; a和b是局部变量,可对其值进行任何修改,例如: a++; b++; 在运行MCJIT期间,我需要获取此行代码中的值 我所说的值不是value类,而是实际的整数或任何类型的值。在执行语句后,在要检查值的位置放置一个断点。在控制台中(lldb)po 虽然我认为监视点更适合您的需求,但是为变量添加一个监视点,比如,watchpointset variable您需要从JITed LLVM函数返回值,以便从调用MCJIT的代码中检索它 看看这个 相关代码

Clang 叮当声:将所有警告升级为错误,但…;

在我目前正在进行的项目中,我们已经决定使用-Werror标志,因为我们以前的“无警告!”策略没有按预期效果运行 然而,这带来了一个特定的问题: API不能再以a)被普通构建工具链标记,b)不会破坏构建的方式标记为不推荐使用 所以我想问题可以归结为: 是否有类似于-Werror no-${something\u I\u不想\u升级为\u错误}? 我发现#pragma-clang诊断错误几乎达到了我想要的效果-除了未能捕获编译器隐式启用的所有警告之外 提前感谢。: -Wno error=foo:将警

Clang 你如何为自己组装一个交叉编译器?

我有点惊讶,我找不到多少关于如何使用llvm从头开始构建跨体系结构或跨操作系统编译器的信息。llvm本身就是开箱即用的。然后您只需要从目标系统收集sysroot,然后以某种方式生成并集成跨平台的binutils 虽然我有大量的随机用例,但我最讨厌的是CodeSourcery。。。基本上不再以arm/linux为目标,构建在Windows上 我正在开发一个基于clang/LLVM的交叉编译工具链。它目前运行在各种Linux平台(ARM、Mips、PowerPC、x86)和Windows x86上。

如何在Clang中禁用pragma消息警告?

#pragma消息以叮当声作为警告实现。 是否有任何方法仅对此pragma禁用警告,这样它将像MS Visual Studio一样,或以其他方式从代码中提供信息性消息? (我需要一个答案作为一个最终用户与给定的叮当声,我不能在这个项目上重新编译叮当声本身) 谢谢你的帮助。我知道这篇文章已经发布一年了,OP可能已经找到了他的答案,但因为我自己也在寻找答案,所以我想我还是把这些信息放在这里吧 从Clang用户手册中: pragma可以控制可从命令行使用的任何警告。警告可以设置为忽略、警告、错误或致

Clang 对“LLVMLinkInInterpreter'”的未定义引用;

我正试图从llvm的示例中编译fibonacci.cpp,以在我的系统(4.6.4-1-ARCH)上测试llvm 3.8(从repo安装) 我得到以下错误。我四处寻找llvm配置参数中缺少的内容,但我并不幸运 下面,我将提供命令run及其输出: [drunk@teapot LLVMPlayBox]$ clang++ fibonacci.cpp `llvm-config --cxxflags --ldflags --libs --system-libs engine` -o fibonacci

Clang 将LLVM IR转换为更高的优化级别

我已经用-O0优化将C代码编译成LLVMIR代码 如何将此-O0LLVM IR代码转换为-O3LLVMIR代码“无C代码” 我试过以下方法: clang -O3 -S -emit-llvm O0.ll -o O3.ll 及 但是输出仍然是-O0级别 谢谢。我不确定更改是什么时候发生的(我认为是LLVM3.9.0及更高版本),但是当您编译为位代码时,函数会被注释为optnone属性,不会执行进一步的优化 查看相关的SO讨论 建议这样做: clang -emit-llvm -O1 -mllvm -

Clang 在编译过程中,是否有一种方便的方法可以将默认的标准库切换到自定义库?

我正在寻找一种方法,在编译期间将默认标准库切换到自定义库,而不使用外部脚本 我想将默认标准库切换为Boost或Facebook Folly,两者似乎都包含在默认标准库中。需要注意的是,它们使用自己的前缀,如boost::或folly::而不是std:: 正在讨论的编译器是叮当作响的++ 出于性能原因,我需要这样做来对自定义库进行基准测试,但我不想手动将整个代码库重构为自定义标准库 我喜欢在代码中保留std::,这样其他开发人员就不会感到困惑 这是否可以在clang中实现?创建一个名称空间nots

Clang “叮当”一词指的是什么?

我想在Clang中尝试一些新功能,有人提到我是ClangTot 现在这可能是一个很明显的问题,因为到底什么是clangtot TOT一定是我不熟悉的缩写词 有人能给我一些启发吗?可能是指“树的顶端”,就像源代码库中的最新代码一样。如果我是他们,我会选择后者!:)我想是这样的。只是以前从未见过。这并不常见,但无论出于什么原因,在LLVM和相关项目中,都习惯这样称呼它。许多LLVM开发人员在苹果工作,而当我在苹果时,TOT的使用就像@martin所描述的一样,非常一致。我想这只是本地风味吧!

如何用Clang编写检查器来检查c文件中的函数是否具有原型

我有一个c文件,我想写一个检查器来检查该文件中的每个函数是否有原型。有谁能帮我做那件事吗。我对叮当声很陌生。我对C++模板、类以及所有的东西有基本的了解。我访问了一些帮助链接,但不是很有用。任何形式的帮助都将不胜感激。请回答此问题?“询问代码的问题必须表明对正在解决的问题的最低理解。包括尝试的解决方案、为什么不起作用以及预期的结果。”

Clang 叮当格式BinPackArguments未按预期工作

clang格式有两个选项,称为BinPackParameters和 BinPackArguments。它们似乎控制着函数声明和函数调用的缩进方式 BinPackParameters似乎为函数声明提供了预期的结果,但BinPackArguments似乎并不像人们预期的那样为函数调用工作 下面是一个简单的测试文件: #include <stdbool.h> void function_with_a_huge_name_that_should_just_not_be(unsigned i

Clang Libtool行为因生成的二进制文件的位置而异

我创建了一个非常简单的基于Clang Libtool的程序,它构建AST并将AST转储到控制台 我正在使用以下命令编译/链接位于LLVM/Clang源代码树外部的程序,以对抗其中一个预构建的二进制文件- c++ -DCLANG_ENABLE_ARCMT -DCLANG_ENABLE_OBJC_REWRITER -DCLANG_ENABLE_STATIC_ANALYZER -DGTEST_HAS_RTTI=0 -DLLVM_BUILD_GLOBAL_ISEL -D_DEBUG -D_GNU_SOU

Clang 叮当声-如何检索;Expr";作为字符串?

我正在使用Clang/libtooling(ASTComsumer和Matcher)访问所有return语句(ReturnStmt)。我需要以字符串形式提取关键字return后面的表达式,这样我就可以将它放在替换return语句的宏中 例如,我想替换以下行: return somefunc() + 1; 与 完成一些日志记录后,宏将从函数返回 我正在使用ReturnStmt::getRetValue(),它返回一个Expr,并试图以字符串形式获取它(以便可以将它传递给宏),但我还没有找到方法。

使用clangllvm延迟加载

使用Windows下的Visual Studio,可以使用DelayImp.lib提供的链接标志“/DelayLoad somelib.lib”延迟加载库和函数 在后台,这样做似乎告诉链接器使用Win32 API LoadLibrary和GetProcAddress包装“somelib.lib”的每个引用函数,这允许在运行时解析函数 我需要在Windows下使用clang实现同样的功能,但是没有找到任何关于这个主题的文档 使用clang/LLVM延迟加载库是可能的,如果是,如何延迟 出于好奇,这

Clang 从另一个通道中加载铿锵通道

我有两个LLVM过程,一个需要另一个的输出。因此,在PassB中,我有: void DiscoPoP::getAnalysisUsage(AnalysisUsage &Info) const{ Info.addRequired<PassA>(); } 如果我也在clang中加载PassA,它会工作:clang-Xclang-load-Xclang LLVMPassA.so-Xclang-load-Xclang LLVMPassB.so 但是如果需要从PassB手动加

Clang “地图命名约定”;";.ll原型的函数参数

我想了解参数是如何以.ll文本格式传递给函数的 我的c函数原型如下所示: int power(int n, int r) clang(后跟opt)编译为: define i32 @power(i32, i32) #0 { “n”和“r”已经消失了!我需要它们在这里,在文本IR中 否则,理解这些参数的实际使用方式并不是一件小事 或者可能有一个模糊的约定,比如函数的第一个参数是“%1”,等等,但这似乎并不明显 有什么想法吗 是否有一个命名约定或任何东西来理解我的“c”参数是如何映射到函数头中的.

Clang 如何修复介子生成错误的链接器标志(--子系统控制台)

我已经创建了一个简单的项目来让自己习惯介子,但是构建一直失败 这就是我所做的(设置环境和构建): 我的meson.build如下所示: project('EtaClient', 'c') src = ['src/main.c', 'src/linkedlist.c'] executable('EtaClient', src) target = 'x86_64-pc-windows-msvc' 生成时,我遇到以下错误(obj文件已成功生成,但它们未链接,因此未生成exe): 当我查看我的buil

clang中std::vector(和其他容器)的边界检查?

在clang中,是否有一种方法可以启用边界检查[]对std::vectors和其他STL容器的访问,最好是在仅以调试模式构建时 我只是花了几个小时寻找一个微妙的bug,结果是由于我们访问了std::vector的末尾。当它检测到错误时,不需要做任何聪明的事情,只需在调试器中设置陷阱,这样我就可以找到错误发生的地方并在代码中修复它 除了“创建从std::vector继承的您自己的类型”之外,还有其他方法可以做到这一点吗 (如果有区别的话,我使用的是clang 3.1版。) 这将启用所有类型的内联检

如何在另一个语句之前使用clang插入一个语句

我必须在某些语句之前添加一个语句,从而使其发出铿锵声。我有一个指向Expr对象的指针,我需要使用它在包含它的语句之前插入另一个语句。现在我使用的是一种黑客方法,它只是将SourceLocation指针向后移动,直到我看到一个;或}或{。但这并不适用于所有情况。例如,当我尝试插入for语句时,它失败了。clang中是否有任何类提供了一种更干净的方法来实现这一点 编辑:这是我的代码片段。我需要在包含指针取消引用的语句之前插入一个断言 bool MyRecursiveASTVisitor::Visit

Clang 叮当作响';s具有子代匹配器和深度嵌套的AST节点

我想匹配在AST上具有作为子代的调用表达式的任何语句。下面是一个简单的例子: int foo() { return 5; } int main() { int a; a = foo(); return 0: } 在这个例子中,我想匹配a=foo()语句。为此,我创建了以下matcher,它工作正常: StatementMatcher sm = stmt(hasParent(compoundStmt()), hasDesce

Clang 重写与某个ASTMatcher匹配的代码

我是clang新手,我想使用astmacher重命名成员变量名。例如: class Person { public: .... private: char m_genger; ^^^^^^^^ => rename to gender_ int m_age; ^^^^^^ => rename to age_ }; 在阅读了一些教程之后,我发现了如何使用ASTMatcher,以便访问要修改的位置 但我有一个赛格。调用cla

Clang 如何建立叮当声?

我想构建一个程序(YCM for VIM),它需要编译的二进制文件来链接。出于某种原因,我不能使用llvm本身提供的预编译版本进行下载(我已经测试过了,它不起作用),所以我想先构建Clang,然后再构建YCM,两者都使用gcc。 对于要构建的YCM,我需要以与llvm提供的预编译包中相同的方式编译Clang文件,即应该有以下文件夹: bin docs include lib share 其中包含相应的文件。 现在,我可以使用以下命令构建llvm和Clang: mkdir llvm &a

Clang _mm_cvtsi64x_si128的强大支持

使用clang-3.5.0(但不是gcc-4.9.2,也不是英特尔编译器),我得到的信息是: use of undeclared identifier '_mm_cvtsi64x_si128'; did you mean '_mm_cvtsi64_si128' 这是我在中发现的一个内在特性,并且所讨论的代码确实包含了intinsics指南中所要求的内容: #include "emmintrin.h" 我想知道这个错误是否是由于没有传递正确的-mcpu=flags导致的,但是我尝试了-mcpu

Clang 重写后的叮当声

我尝试对函数体进行一些重写,现在只想以源代码形式打印该函数体。我尝试过使用dumpPretty,但它似乎可以在没有重写的情况下打印原始源代码。有没有人对此有什么建议?看看源代码,dumpPretty似乎从AST重建了文本。要以这种方式变换身体,我必须直接修改AST

Clang 铿锵旗帜的完整文档在哪里?

我知道的参考资料如下: 但是我找不到像-msse4.1这样的标志,所以在clang.llvm.org上是否有支持的标志的完整列表,或者我们是否需要外部文档?使用CTRL+F查找-m目标标志 可能的重复:

Clang 编写AST matcher以查找所有没有break语句的case语句

我想找到所有case语句都没有break语句。我使用clang查询来构建匹配器。我的matcher在一些测试用例中失败了 我写了一个简单的matcher作为 匹配caseStmt(除非有(breakStmt())) 它适用于以下测试用例 #include<stdlib.h> int main(){ int x; switch(x){ case 1: break; case 2: default: x++; } return 0; } 不

Clang 如何制作LLVM';s`opt`命令优化内置函数?

考虑以下C程序: #include <stdlib.h> int main() { int * ptr = malloc(8); *ptr = 14; return 4; } 对malloc的调用消失了,因为它是clang知道的一个内置函数。 如果我们运行clang-S-emit llvm-O1-fno builtin,我们将: clang不知道什么是malloc,必须让电话留在家里 如何使用LLVM的opt命令从第二个LLVM程序到第一个LLVM程序?我

Clang 如何在包含stdio.h文件的文件上使用叮当声检查器时避免stdio.h错误

我已经在clang中实现了一个检查器。我已经编译了它,现在我用它检查一个c文件,其中包括stdio.h文件。我发出以下命令来运行检查程序: clang-cc1-analyze-analyzer checker=alpha.core.FuncPrototype原型funcprototypetest.c 我得到以下错误: funcprototypetest.c:1:10:致命错误:“未找到stdio.h”文件 #include <stdio.h> ^ #包括 ^ 有人能帮我

如何忽略使用clang格式3.9的文件或目录

我目前正在使用travis ci检查进入github的补丁程序,并试图找出是否有任何原因让clang format 3.9(因为travis ci目前只支持最新版本的ubuntu 14.04)在扫描更改时忽略整个目录或文件 My.travis.yml文件: language: c++ sudo: required dist: trusty install: - sudo apt-get update - sudo apt-get install clang-format-3.9 python3

Clang getFilename返回一个空字符串

我有一个文件,我想从中提取其文件名。显然,我应该可以通过使用的。然而,当我处理一些头文件时,结果似乎总是一个空字符串 我遵循源代码,发现问题在于getFilename函数中,该函数的内容如下: /// Return the filename of the file containing a SourceLocation. StringRef getFilename(SourceLocation SpellingLoc) const { if (const FileEntry *F = get

如何使用clang/LLVM交叉编译Coreutils或其他GNU项目?

我非常需要为其他arch使用llvm编译Coreutils:arm/aarch64/mips/mips32/ppc/ppc32 因为我安装了所有的gcc交叉工具,比如mips linux gnu,powerpc64 linux gnu,如果我有一个简单的C程序,比如test.C #include<stdio.h> int main(){ printf("hello!"); return 0; } 我尝试以同样的方式编译Coreutils,它尝试设置 export C

Clang 使用非法指令生成可执行文件

我把我看到的问题归结为一个小例子。下面是我正在使用的LLVM汇编程序代码(在foo.ll中): 然后,我使用以下工具进行编译: clang -O1 -o foo foo.ll 。。。当我运行它时,我得到: Illegal instruction (core dumped) 。。。因此,我启动了调试器,并看到以下内容: Program received signal SIGILL, Illegal instruction. 0x00000000004004d0 in main () (gdb)

Clang 使用libc++;在窗户上?

libc++是否支持在以Clang/LLVM为本机的Windows上引用/包含和编译?对于土生土长的人来说,我的意思是不依赖明格和西格温。我没有找到太多关于这个的文档,但我相信它应该得到支持,因为clang for Windows已经发布很长时间了。只是一个更新。现在有实验支持(2018年初): (来自链接) 假设您已经签出了Ninja和libcxx/llvm,那么libcxx可以通过 > cmake -G Ninja

使用Clang AST语句匹配器查找嵌套循环

我试图使用clang语句匹配器在嵌套循环中查找变量 for(i=0;i<10;i++) for(j=0;j<10;j++) //I have i and j for(i=0;i据我所知),如果不为要匹配的每个可能深度N创建N个匹配器,就无法匹配N-nested for循环。 例如 方法以确保循环初始化、条件化和递增相同的变量 static bool areSameVariable(const ValueDecl *First, const ValueDecl *Se

Clang Cocoapods脱毛错误:";“没有此类模块”;对于C++;在子模块中导入 问题

尽管podspec同时定义了source={:submodules=>true}和pod\u target\u xcconfig={'SWIFT\u INCLUDE\u PATHS'=>'$(PODS\u ROOT)/SpokeStack/filter\u audio/**,但SWIFT编译器似乎找不到filter\u audiogit子模块的模块名(在子模块的modulemap中定义)当从CocoaPods调用时。这在正常的xcodebuild调用中不是问题 复制步骤 git克隆https:/

  1    2   3   4   5   6  ... 下一页 最后一页 共 7 页