-fnonansi-builtins | CL_CXX | CL_ObjCXX | |
-fnonnull-objects | 已过时,不支持 | CL_CXX | CL_ObjCXX |
-fold-unroll-all-loops | CL_COMMON | |
-fold-unroll-loops | CL_COMMON | |
-fomit-frame-pointer | CL_COMMON | |
-foperator-names | 识别C++的关键字如and,bitand,bitor,compl,not,or及xor,分别对应操作符&&,&,|,~,!,||及^。这可以防止这些名字被它用而导致老的代码出错。 | CL_CXX | CL_ObjCXX |
-foptimize-register-move | 执行完整的寄存器移动优化遍 | CL_COMMON |
-foptimize-sibling-calls | CL_COMMON | |
-foptional-diags | 启用可选的诊断信息 | CL_CXX | CL_ObjCXX |
-fpack-struct | CL_COMMON | |
-fpcc-struct-return | CL_COMMON | |
-fpch-deps | 使用预编译头文件时,这个选项会设置依赖-输出(dependency-output)标识,根据预编译头文件的依赖信息列出文件。否则只有这个预编译头文件被列出,不包括那些创建它的文件,因为使用预处理头文件时,这些文件不会被参考(consulted)。 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fpeel-loops | CL_COMMON | |
-fpeephole | CL_COMMON | |
-fpeephole2 | CL_COMMON | |
-fpermissive | CL_CXX | CL_ObjCXX | |
-fpic | 参见flag_pic | CL_COMMON |
-fpie | 参见flag_pie | CL_COMMON |
-fprefetch-loop-arrays | CL_COMMON | |
-fpreprocessed | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | |
-fprofile | 启动基本的程序分析(profiling)代码 | CL_COMMON |
-fprofile-arcs | 插入基于弧(arc-based)的程序分析代码 | CL_COMMON |
-fprofile-generate | 使能为分析回馈导向优化(profile feedback directed optimization)产生分析信息的普通(common)选项 | CL_COMMON |
-fprofile-use | 使能分析回馈导向优化(profile feedback directed optimization)的普通(common)选项 | CL_COMMON |
-fprofile-values | 插入分析(profile)表达式值的代码 | CL_COMMON |
-frandom-seed | CL_COMMON | |
-frandom-seed=<string> | CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE | |
-freduce-all-givs | CL_COMMON | |
-freg-struct-return | 在寄存器中返回小的聚集类 | CL_COMMON |
-fregmove | 启动寄存器移动优化(register move optimization) | CL_COMMON |
-frename-registers | 执行寄存器重命名优化遍(register renaming optimization pass) | CL_COMMON |
-freorder-blocks | CL_COMMON | |
-freorder-functions | CL_COMMON | |
-frepo | 使能模板自动具现(automatic template instantiation) | CL_CXX | CL_ObjCXX |
-frerun-cse-after-loop | 在循环优化后增加一次公共子表达式消除遍 | CL_COMMON |
-frerun-loop-opt | 运行2次循环优化 | CL_COMMON |
-frounding-math | 禁止基于FP默认取整行为的优化 | CL_COMMON |
-frtti | 产生运行时类型描述符信息(run time type descriptor information) | CL_CXX | CL_ObjCXX |
-fsched-interblock | 启动基本块间的调度(scheduling across basic blocks) | CL_COMMON |
-fsched-spec | CL_COMMON | |
-fsched-spec-load | CL_COMMON | |
-fsched-spec-load-dangerous | CL_COMMON | |
-fsched-stalled-insns | CL_COMMON | |
-fsched-stalled-insns=<number> | CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE | CL_UINTEGER | |
-fsched-stalled-insns-dep | CL_COMMON | |
-fsched-stalled-insns-dep=<number> | CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE | CL_UINTEGER | |
-fsched-verbose=<number> | 设置调度器的冗余程度(verbosity level of the scheduler) | CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE |
-fsched2-use-superblocks | CL_COMMON | |
-fsched2-use-traces | CL_COMMON | |
-fschedule-insns | CL_COMMON | |
-fschedule-insns2 | CL_COMMON | |
-fshared-data | CL_COMMON | |
-fshort-double | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | |
-fshort-enums | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | |
-fshort-wchar | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | |
-fshow-column | !!! This switch lacks documentation | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fsignaling-nans | CL_COMMON | |
-fsigned-bitfields | 默认位域为有符号 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fsigned-char | 默认char有符号 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fsingle-precision-constant | 转换浮点常量为单精度常量 | CL_COMMON |
-fsquangle | 已过时,不支持 | CL_CXX | CL_ObjCXX |
-fstack-check | 在程序中插入栈检查代码 | CL_COMMON |
-fstack-limit | CL_COMMON | |
-fstack-limit-register=<register> | CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE | |
-fstack-limit-symbol=<name> | ||
-fstats | 显示编译期的统计信息 | CL_CXX | CL_ObjCXX |
-fstrength-reduce | 执行强度折减(strength reduction)优化 | CL_COMMON |
-fstrict-aliasing | 应用严格别名(strict aliasing rule) | CL_COMMON |
-fstrict-prototype | 已过时,不支持 | CL_CXX | CL_ObjCXX |
-fsyntax-only | 只检查语法错误 | CL_COMMON |
-ftabstop=<number> | Tab的大小 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_REJECT_NEGATIVE | CL_UINTEGER |
-ftemplate-depth-<number> | 指定最大模板具现深度 | CL_CXX | CL_ObjCXX | CL_JOINED | CL_REJECT_NEGATIVE | CL_UINTEGER |
-ftest-coverage | 创建gcov需要的数据文件 | CL_COMMON |
-fthis-is-variable | 已过时,不支持 | CL_CXX | CL_ObjCXX |
-fthread-jumps | CL_COMMON | |
-ftime-report | 报告每个编译遍的用时 | CL_COMMON |
-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec] | 设置默认的线程局部储存代码的产生模式(default thread-local storage code generation model) | CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE |
-ftracer | CL_COMMON | |
-ftrapping-math | 假定浮点操作会导致trap | CL_COMMON |
-ftrapv | 在加,减及乘时发生溢出,即导致trap | CL_COMMON |
-funit-at-a-time | 一次编译一个编译单元 | CL_COMMON |
-funroll-all-loops | CL_COMMON | |
-funroll-loops | CL_COMMON | |
-funsafe-math-optimizations | 允许可能违反IEEE或ISO标准的算是优化 | CL_COMMON |
-funsigned-bitfields | 默认位域为无符号 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-funsigned-char | 默认char无符号 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-funswitch-loops | CL_COMMON | |
-funwind-tables | CL_COMMON | |
-fuse-cxa-atexit | 使用__cxa_atexit来注册析构函数 | CL_CXX | CL_ObjCXX |
-fverbose-asm | 在汇编输出中添加注释 | CL_COMMON |
-fvpt | 在优化中使用表达式值分析(expression value profile) | CL_COMMON |
-fvtable-gc | 丢弃未使用的虚函数 | CL_CXX | CL_ObjCXX |
-fvtable-thunks | 使用thunk实行虚函数表 | CL_CXX | CL_ObjCXX |
-fweak | CL_CXX | CL_ObjCXX | |
-fweb | 参见flag_web | CL_COMMON |
-fwide-exec-charset=<cset> | 把宽字符串及字符常量转换为字符集<cset> | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_REJECT_NEGATIVE |
-fworking-directory | 产生指向当前工作目录的#line指示 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fwrapv | 使有符号数学计算的溢出回绕(wraps around) | CL_COMMON |
-fwritable-strings | 把字符串存入数据段 | CL_COMMON |
-fxref | 产生相互引用的信息(cross referencing information) | CL_CXX | CL_ObjCXX |
-fzero-initialized-in-bss | 把0值初始化数据放入bss段 | CL_COMMON |
-g | 在默认格式中产生调试信息 | CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gcoff | 在COFF格式中产生调试信息 | CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gdwarf-2 | 在DWARF2格式中产生调试信息 | CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gen-decls | 转储声明至.decl文件 | CL_ObjC | CL_ObjCXX |
-ggdb | 在默认的扩展格式中产生调试信息 | CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gstabs | 在STABS格式中产生调试信息 | CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gstabs+ | 在扩展STABS格式中产生调试信息 | CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gvms | 在VMS格式中产生调试信息 | CL_COMMON|CL_JOINED | CL_MISSING_OK |
-gxcoff | 在XCOFF格式中产生调试信息 | CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gxcoff+ | 在扩展XCOFF格式中产生调试信息 | CL_COMMON | CL_JOINED | CL_MISSING_OK |
-idirafter<dir> | 在系统包含路径(the system include path)后,加入<dir> | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-imacros<file> | 在<file>中接受宏定义,但丢弃其它由扫描文件产生的内容 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-include<file> | 在其他文件前包含<file>的内容 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-iprefix<path> | 参见iprefix | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-isysroot<dir> | 把<dir>设为系统根目录(the system root directory) | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-isystem<dir> | 把<dir>加到系统包含路径(the system include path)开头 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-iwithprefix <dir> | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE | |
-iwithprefixbefore<dir> | ||
-lang-asm | !!! This switch lacks documentation | CL_C | CL_UNDOCUMENTED |
-lang-objc | 编译objC代码 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_UNDOCUMENTED |
-m | 与目标机器相关选项的前缀 | CL_COMMON | CL_JOINED |
-nostdinc | 不要在标准系统包含目录下查找(那些由-isystem指定的目录仍会被使用) | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-nostdinc++ | 不要在C++的标准系统包含目录下查找 | CL_CXX | CL_ObjCXX |
-o <file> | 产生输出文件<file> | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_COMMON | CL_JOINED | CL_SEPARATE |
-p | 启动函数分析 | CL_COMMON |
-pedantic | 产生为严格遵循标准而需要的警告 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_COMMON |
-pedantic-errors | 类似-pedantic但产生错误而不是警告 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_COMMON |
-quiet | 不要显示函数名及用时 | CL_COMMON |
-remap | 使能特殊的代码来避开那些只允许短文件名的文件系统,如MS-DOS | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-std=c++98 | 符合ISO 1998 C++标准 | CL_CXX | CL_ObjCXX |
-std=c89 | 符合ISO 1990 C标准 | CL_C | CL_ObjC |
-std=c99 | 符合ISO 1999 C标准 | CL_C | CL_ObjC |
-std=c9x | 已过时,应使用-std=c99 | CL_C | CL_ObjC |
-std=gnu++98 | 符合ISO 1998 C++标准,连同GNU 扩展 | CL_CXX | CL_ObjCXX |
-std=gnu89 | 符合ISO 1990 C标准,连同GNU 扩展 | CL_C | CL_ObjC |
-std=gnu99 | 符合ISO 1999 C标准,连同GNU 扩展 | CL_C | CL_ObjC |
-std=gnu9x | 已过时,应使用-std=gnu99 | CL_C | CL_ObjC |
-std=iso9899:1990 | 符合ISO 1990 C标准 | CL_C | CL_ObjC |
-std=iso9899:199409 | 符合1994年修改的ISO 1990 C标准 | CL_C | CL_ObjC |
-std=iso9899:1999 | 符合ISO 1999 C标准 | CL_C | CL_ObjC |
-std=iso9899:199x | 已过时,应使用-std=iso9899:1999 | CL_C | CL_ObjC |
-traditional-cpp | 启动传统预处理 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-trigraphs | 支持ISO C的三字符词 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-undef | 不要预定义特定于系统及GCC的宏 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-v | 启动详细输出 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-version | 显示编译器的版本 | CL_COMMON |
-w | 压制警告 | CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_COMMON |
表 11: C++可用选项
在上表中,选项被赋予不同的标记集,其中的标记可分为2组。其一表示选项所适用的语言。这些选项如下。
3 #define CL_C (1 << 0) in options.h
4 #define CL_CXX (1 << 1)
5 #define CL_ObjC (1 << 2)
6 #define CL_ObjCXX (1 << 3)
另一组表明选项的特性,其中CL_COMMON其实应该属于前一组。
40 #define CL_JOINED (1 << 24) /* If takes joined argument. */ in opts.h
41 #define CL_SEPARATE (1 << 25) /* If takes a separate argument. */
42 #define CL_REJECT_NEGATIVE (1 << 26) /* Reject no- form. */
43 #define CL_MISSING_OK (1 << 27) /* Missing argument OK (joined). */
44 #define CL_UINTEGER (1 << 28) /* Argument is an integer >=0. */
45 #define CL_COMMON (1 << 29) /* Language-independent. */
46 #define CL_UNDOCUMENTED (1 << 30) /* Do not output with --help. */
走到到这里,表明确实有这样的选项,要检查该选项是否正确有效。下面397行的检查实际已由find_opt执行了,但find_opt对不适用于该语言的选项并不拒绝,因此,这里再一次把它们找出来,给出警告并丢弃之。
handle_option (continue)
364 /* We've recognized this switch. */
365 result = 1;
366
367 /* Sort out any argument the switch takes. */
368 if (option->flags & CL_JOINED)
369 {
370 /* Have arg point to the original switch. This is because
371 some code, such as disable_builtin_function, expects its
372 argument to be persistent until the program exits. */
373 arg = argv[0] + cl_options[opt_index].opt_len + 1;
374 if (!value)
375 arg += strlen ("no-");
376
377 if (*arg == '/0' && !(option->flags & CL_MISSING_OK))
378 {
379 if (option->flags & CL_SEPARATE)
380 {
381 arg = argv[1];
382 result = 2;
383 }
384 else
385 /* Missing argument. */
386 arg = NULL;
387 }
388 }
389 else if (option->flags & CL_SEPARATE)
390 {
391 arg = argv[1];
392 result = 2;
393 }
394
395 /* Now we've swallowed any potential argument, complain if this
396 is a switch for a different front end. */
397 if (!(option->flags & (lang_mask | CL_COMMON)))
398 {
399 complain_wrong_lang (argv[0], option, lang_mask);
400 goto done;
401 }
402
403 if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
404 {
405 if (!(*lang_hooks.missing_argument) (opt, opt_index))
406 error ("missing argument to /"%s/"", opt);
407 goto done;
408 }
409
410 /* If the switch takes an integer, convert it. */
411 if (arg && (option->flags & CL_UINTEGER))
412 {
413 value = integral_argument (arg);
414 if (value == -1)
415 {
416 error ("argument to /"%s/" should be a non-negative integer",
417 option->opt_text);
418 goto done;
419 }
420 }
对于CL_JOINED属性的选项,它类似-A=value或者-Avalue。而CL_SEPARATE属性的选项,则类似-A= value或者-A value。因此,上述代码片段获取选项的参数。
handle_option (continue)
422 if (option->flags & lang_mask)
423 if ((*lang_hooks.handle_option) (opt_index, arg, value) == 0)
424 result = 0;
425
426 if (result && (option->flags & CL_COMMON))
427 if (c_common_handle_option (opt_index, arg, value) == 0)
428 result = 0;
429
430 done:
431 if (dup)
432 free (dup);
433 return result;
434 }
在合格的选项中,422行挑出专用于语言的部分,由前端钩子提供处理函数。