命令行选项

这一节是一个到其他各节的索引。没有深入讨论其他各节覆盖的内容。然而,第一部分介绍了语言选择和其他高级选项例如-c、-g等等。

控制错误和警告信息的选项

-Werror

将警告转换成错误。

-Wno-error=foo

保持警告“foo”不被转换成错误,即使-Werror被指定。

-Wfoo

使能警告“foo”。

-w

禁用所有警告。

-Weverything

使能所有警告。

-pedantic

警告语言扩展。

-pedantic-errors

把语言扩展视作错误。

-Wsystem-headers

使能来自系统头文件的警告。

-ferror-limit=123

在诊断出123个错误之后停止诊断。默认是20,错误限制可以通过-ferror-limit=0来禁用。

-ftemplate-backtrace-limit=123

最多实例化123个模板在模板实例化回溯对于单个警告或错误。限制的默认是10,也可以通过-ftemplate-backtrace-limit=0来禁用。

格式化诊断信息

Clang默认旨在生成漂亮的诊断信息,特被对于clang的新用户。然而,不同的人具有不同的喜好,并且有时候Clang被另一个程序调用想要解析简单和一致的输出,而不是一个人。对于这些情形,Clang提供了一个广泛的范围的选项来控制它生成的诊断信息的输出格式。

-f[no-]show-column

在诊断信息中打印列数。

这个选项,默认是开启的,控制是否Clang打印一个诊断信息的列数。举个例子,当使能之后,Clang将会打印如下:

  1. test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
  2. #endif bad
  3. ^
  4. //

当被禁用之后,Clang将会打印”test.c:28:warning…”而没有列号。

打印出的列号从一行开始计数;小心你的源代码中包含多字节字符。

-f[no-]show-source-location

在诊断信息中打印源 文件/行/列 信息。

这个选项,默认是开启的,控制Clang是否打印一个诊断的文件名、行号和列号。举个例子,当被使能之后,Clang将会有如下输出:

  1. test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
  2. #endif bad
  3. ^
  4. //

当被禁用之后,Clang将不会打印”test.c:28:8”部分。

-f[no-]caret-diagnostics

在诊断信息中打印源代码文件行和范围。这个选项,默认是开启的,控制Clang在遇到一个诊断时候是否打印源行、代码范围和插入记号。举个例子,当被使能之后,Clang将会有如下输出:

  1. test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
  2. #endif bad
  3. ^
  4. //

-f[no-]color-diagnostics

这个选项,在一个检测到兼容彩色的中断终端上默认是开启的,控制Clang是否带颜色输出。

当被使能之后,Clang将会使用高粱指定诊断中特殊部分,例如:

  1. test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
  2. #endif bad
  3. ^
  4. //

当被禁用时候,Clang将只输出:

  1. test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
  2. #endif bad
  3. ^
  4. //

-fdiagnostics-format=clang/msvc/vi

改变诊断输出使得更高的匹配IDE和命令行工具。

这个选项控制诊断信息中文件名、行号和列的输出格式。这个选项和它的效果格式化一个简单变换诊断,如下:

clang (默认)

  1. t.c:3:11: warning: conversion specifies type 'char *' but the argument has type 'int'

msvc

  1. t.c(3,11) : warning: conversion specifies type 'char *' but the argument has type 'int'

vi

  1. t.c +3:11: warning: conversion specifies type 'char *' but the argument has type 'int'

-f[no-]diagnostics-show-name

使能显示诊断名称。这个选项,默认是关闭的,控制Clang是否打印相关名称。

-f[no-]diagnostics-show-option

在诊断行中使能[-Woption]信息。

这个选项,默认是开启的,控制输出一个警告诊断时候Clang是否打印相关的警告组选项名称。举个例子,在这个输出中:

  1. test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
  2. #endif bad
  3. ^
  4. //

传递-fno-diagnostics-show-option将会阻止Clang在诊断中打印[-Wextra-tokens]信息。这个信息告诉你需要使能或者禁止诊断的标志,不论是从命令行还是#pragma GCC diagnostic。

-fdiagnostics-show-category=none/id/name

使能在诊断行打印分类信息。

这个选项,默认是”none”,控制Clang在生成诊断的时候是否打印关联的分类。每个诊断信息可能关联或者无关联到一个类,如果有一个,它被列在诊断行中的类域中(在[]中)。

举个例子,一个格式化字符串警告将会产生如下三行基于这个选项的设置:

  1. t.c:3:11: warning: conversion specifies type 'char *' but the argument has type 'int' [-Wformat]
  2. t.c:3:11: warning: conversion specifies type 'char *' but the argument has type 'int' [-Wformat,1]
  3. t.c:3:11: warning: conversion specifies type 'char *' but the argument has type 'int' [-Wformat,Format String]

分类可以被客户端使用需要按照类把诊断信息分组的话,所以它应当是一个高的级别。我们只需要几十个,而不是成百上千。

-f[no-]diagnostics-fixit-info

在诊断输出中使能”FixIt”信息。

这个选项,默认是开启的,控制Clang当它知道时是否打印如何修复特定诊断信息。举个例子,在这个输出中:

  1. test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
  2. #endif bad
  3. ^
  4. //

传递-fno-diagnostics-fixit-info将会阻止Clang打印末尾的”//“行。这个信息对不了解是什么错误的用户是非常有用的,但是可能会迷惑机器解析。

-fdiagnostics-print-source-range-info

打印机器可以解析的有关源范围的信息。这个选项使得Clang以机器可解析格式在 文件/行/列 后打印有关源范围信息。这个信息是一些花括号中的简单序列,每个范围列出了开始和结束 行/列 位置。举个例子,在这个输出中:

  1. exprs.c:47:15:{47:8-47:14}{47:17-47:24}: error: invalid operands to binary expression ('int *' and '_Complex float')
  2. P = (P-42) + Gamma*4;
  3. ~~~~~~ ^ ~~~~~~~

{}是由 -fdiagnostics-print-source-range-info 产生的。

打印的列号从行开始计数;小心你的文件中多字节字符。

-fdiagnostics-parseable-fixits

以机器可解析格式打印Fix-It。

这个选项使得Clang以一种机器可解析的格式在诊断末尾打印可用的Fix-It信息。下边的例子展示了格式:

  1. fix-it:"t.cpp":{7:25-7:29}:"Gamma"

输出中的范围是一个半开范围,所以在这个例子中列t.cpp中25起的字符到但是不包含行7列29的字符串应当被”Gamma”替换。这个范围或者取代字符串都可能为空(分别代表严格的插入和严格擦除)。文件名和插入字符串逃逸反斜杠(“\“),tab(“\t”),新行(“\n”),双引号(“\””)和不可打印字符(八进制”\xxx”)。

打印的列号从行首开始计数;小心文件中的多字节字符。

-fno-elide-type

在模板类型打印中关闭省略。

默认的模板类型打印省略尽可能多的模板参数,移除在模板类型中相同的,只留下不同的。添加这个标志将会打印所有模板参数。如果终端支持,高亮将出现在不同的参数。

默认:

  1. t.cc:4:5: note: candidate function not viable: no known conversion from 'vector<map<[...], map<float, [...]>>>' to 'vector<map<[...], map<double, [...]>>>' for 1st argument;

-fno-elide-type:

  1. t.cc:4:5: note: candidate function not viable: no known conversion from 'vector<map<int, map<float, int>>>' to 'vector<map<int, map<double, int>>>' for 1st argument;

-fdiagnostics-show-template-tree

模板类型区分打印文本的树。

对于大型的模板类型,这个选项将会导致一个故意的文本树,一个参数一行,具有不同的行内标记。这与 -fno-elide-type 兼容。

默认:

  1. t.cc:4:5: note: candidate function not viable: no known conversion from 'vector<map<[...], map<float, [...]>>>' to 'vector<map<[...], map<double, [...]>>>' for 1st argument;

使用 -fdiagnostics-show-template-tree

  1. t.cc:4:5: note: candidate function not viable: no known conversion for 1st argument;
  2. vector<
  3. map<
  4. [...],
  5. map<
  6. [float != float],
  7. [...]>>>

单独警告组

TODO: 从tblgen生成这个。为每个警告组定义一个锚。

-Wextra-tokens

警告一个预处理指令尾部的过度的标识符。

这个选项,默认是开启的,使能警告一个预处理指令尾部的过度的标识符。举例如下:

  1. test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
  2. #endif bad
  3. ^

这些额外的标识符不严格符合,通常最好注释掉他们。

-Wambiguous-member-template

警告有关不合格的成员模板的使用,在使用点名字解析到另一个模板。

这个选项,默认是开启的,使能警告如下代码中:

  1. template<typename T> struct set{};
  2. template<typename T> struct trait { typedef const T& type; };
  3. struct Value {
  4. template<typename T> void set(typename trait<T>::type value) {}
  5. };
  6. void foo() {
  7. Value v;
  8. v.set<double>(3.2);
  9. }

C++[basic.lookup.classref] 需要这个成为一个错误,但是,因为工作比较苦难,Clang把它降级为一个警告作为一个扩展。

-Wbind-to-temporary-copy

警告关于一个不可用的复制构造器当绑定一个引用到一个暂时的。

这个选项,默认是开启的,使能警告有关绑定一个引用到一个临时的,当临时的没有一个可用的复制构造子。举个例子:

  1. struct NonCopyable {
  2. NonCopyable();
  3. private:
  4. NonCopyable(const NonCopyable&);
  5. };
  6. void foo(const NonCopyable&);
  7. void bar() {
  8. foo(NonCopyable()); // Disallowed in C++98; allowed in C++11.
  9. }


  1. struct NonCopyable2 {
  2. NonCopyable2();
  3. NonCopyable2(NonCopyable2&);
  4. };
  5. void foo(const NonCopyable2&);
  6. void bar() {
  7. foo(NonCopyable2()); // Disallowed in C++98; allowed in C++11.
  8. }

注意如果 NonCopyable2::NonCopyable2() 具有一个默认参数,它的实例化产生一个编译错误,这个错误在C++98模式中仍然是一个硬错误,即使这个警告被关闭。

控制Clang崩溃诊断选项

听起来不可信,Clang不时的崩溃。通常,这只发生在those living on the bleeding edge。Clang可以帮助你填一个bug报告。特别的,Clang生成预编译的源文件额相关的运行脚本在一个崩溃之上。这些文件应当被附件到bug报告。下边是命令行选项来控制崩溃诊断。

-fno-crash-diagnostics

禁止在一个clang崩溃期间自动生成预编译的源文件。

-fno-crash-diagnostics标志可以对于加速生成处理有帮助。