命令行选项
这一节是一个到其他各节的索引。没有深入讨论其他各节覆盖的内容。然而,第一部分介绍了语言选择和其他高级选项例如-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将会打印如下:
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
#endif bad
^
//
当被禁用之后,Clang将会打印”test.c:28:warning…”而没有列号。
打印出的列号从一行开始计数;小心你的源代码中包含多字节字符。
-f[no-]show-source-location
在诊断信息中打印源 文件/行/列 信息。
这个选项,默认是开启的,控制Clang是否打印一个诊断的文件名、行号和列号。举个例子,当被使能之后,Clang将会有如下输出:
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
#endif bad
^
//
当被禁用之后,Clang将不会打印”test.c:28:8”部分。
-f[no-]caret-diagnostics
在诊断信息中打印源代码文件行和范围。这个选项,默认是开启的,控制Clang在遇到一个诊断时候是否打印源行、代码范围和插入记号。举个例子,当被使能之后,Clang将会有如下输出:
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
#endif bad
^
//
-f[no-]color-diagnostics
这个选项,在一个检测到兼容彩色的中断终端上默认是开启的,控制Clang是否带颜色输出。
当被使能之后,Clang将会使用高粱指定诊断中特殊部分,例如:
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
#endif bad
^
//
当被禁用时候,Clang将只输出:
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
#endif bad
^
//
-fdiagnostics-format=clang/msvc/vi
改变诊断输出使得更高的匹配IDE和命令行工具。
这个选项控制诊断信息中文件名、行号和列的输出格式。这个选项和它的效果格式化一个简单变换诊断,如下:
clang (默认)
t.c:3:11: warning: conversion specifies type 'char *' but the argument has type 'int'
msvc
t.c(3,11) : warning: conversion specifies type 'char *' but the argument has type 'int'
vi
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是否打印相关的警告组选项名称。举个例子,在这个输出中:
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
#endif bad
^
//
传递-fno-diagnostics-show-option将会阻止Clang在诊断中打印[-Wextra-tokens]信息。这个信息告诉你需要使能或者禁止诊断的标志,不论是从命令行还是#pragma GCC diagnostic。
-fdiagnostics-show-category=none/id/name
使能在诊断行打印分类信息。
这个选项,默认是”none”,控制Clang在生成诊断的时候是否打印关联的分类。每个诊断信息可能关联或者无关联到一个类,如果有一个,它被列在诊断行中的类域中(在[]中)。
举个例子,一个格式化字符串警告将会产生如下三行基于这个选项的设置:
t.c:3:11: warning: conversion specifies type 'char *' but the argument has type 'int' [-Wformat]
t.c:3:11: warning: conversion specifies type 'char *' but the argument has type 'int' [-Wformat,1]
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当它知道时是否打印如何修复特定诊断信息。举个例子,在这个输出中:
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
#endif bad
^
//
传递-fno-diagnostics-fixit-info将会阻止Clang打印末尾的”//“行。这个信息对不了解是什么错误的用户是非常有用的,但是可能会迷惑机器解析。
-fdiagnostics-print-source-range-info
打印机器可以解析的有关源范围的信息。这个选项使得Clang以机器可解析格式在 文件/行/列 后打印有关源范围信息。这个信息是一些花括号中的简单序列,每个范围列出了开始和结束 行/列 位置。举个例子,在这个输出中:
exprs.c:47:15:{47:8-47:14}{47:17-47:24}: error: invalid operands to binary expression ('int *' and '_Complex float')
P = (P-42) + Gamma*4;
~~~~~~ ^ ~~~~~~~
{}是由 -fdiagnostics-print-source-range-info 产生的。
打印的列号从行开始计数;小心你的文件中多字节字符。
-fdiagnostics-parseable-fixits
以机器可解析格式打印Fix-It。
这个选项使得Clang以一种机器可解析的格式在诊断末尾打印可用的Fix-It信息。下边的例子展示了格式:
fix-it:"t.cpp":{7:25-7:29}:"Gamma"
输出中的范围是一个半开范围,所以在这个例子中列t.cpp中25起的字符到但是不包含行7列29的字符串应当被”Gamma”替换。这个范围或者取代字符串都可能为空(分别代表严格的插入和严格擦除)。文件名和插入字符串逃逸反斜杠(“\“),tab(“\t”),新行(“\n”),双引号(“\””)和不可打印字符(八进制”\xxx”)。
打印的列号从行首开始计数;小心文件中的多字节字符。
-fno-elide-type
在模板类型打印中关闭省略。
默认的模板类型打印省略尽可能多的模板参数,移除在模板类型中相同的,只留下不同的。添加这个标志将会打印所有模板参数。如果终端支持,高亮将出现在不同的参数。
默认:
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:
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 兼容。
默认:
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
t.cc:4:5: note: candidate function not viable: no known conversion for 1st argument;
vector<
map<
[...],
map<
[float != float],
[...]>>>
单独警告组
TODO: 从tblgen生成这个。为每个警告组定义一个锚。
-Wextra-tokens
警告一个预处理指令尾部的过度的标识符。
这个选项,默认是开启的,使能警告一个预处理指令尾部的过度的标识符。举例如下:
test.c:28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
#endif bad
^
这些额外的标识符不严格符合,通常最好注释掉他们。
-Wambiguous-member-template
警告有关不合格的成员模板的使用,在使用点名字解析到另一个模板。
这个选项,默认是开启的,使能警告如下代码中:
template<typename T> struct set{};
template<typename T> struct trait { typedef const T& type; };
struct Value {
template<typename T> void set(typename trait<T>::type value) {}
};
void foo() {
Value v;
v.set<double>(3.2);
}
C++[basic.lookup.classref] 需要这个成为一个错误,但是,因为工作比较苦难,Clang把它降级为一个警告作为一个扩展。
-Wbind-to-temporary-copy
警告关于一个不可用的复制构造器当绑定一个引用到一个暂时的。
这个选项,默认是开启的,使能警告有关绑定一个引用到一个临时的,当临时的没有一个可用的复制构造子。举个例子:
struct NonCopyable {
NonCopyable();
private:
NonCopyable(const NonCopyable&);
};
void foo(const NonCopyable&);
void bar() {
foo(NonCopyable()); // Disallowed in C++98; allowed in C++11.
}
struct NonCopyable2 {
NonCopyable2();
NonCopyable2(NonCopyable2&);
};
void foo(const NonCopyable2&);
void bar() {
foo(NonCopyable2()); // Disallowed in C++98; allowed in C++11.
}
注意如果 NonCopyable2::NonCopyable2() 具有一个默认参数,它的实例化产生一个编译错误,这个错误在C++98模式中仍然是一个硬错误,即使这个警告被关闭。
控制Clang崩溃诊断选项
听起来不可信,Clang不时的崩溃。通常,这只发生在those living on the bleeding edge。Clang可以帮助你填一个bug报告。特别的,Clang生成预编译的源文件额相关的运行脚本在一个崩溃之上。这些文件应当被附件到bug报告。下边是命令行选项来控制崩溃诊断。
-fno-crash-diagnostics
禁止在一个clang崩溃期间自动生成预编译的源文件。
-fno-crash-diagnostics标志可以对于加速生成处理有帮助。