c_common_handle_option (continue)
657 case OPT_Wwrite_strings:
658 if (!c_dialect_cxx ())
659 flag_const_strings = value;
660 else
661 warn_write_strings = value;
662 break;
663
664 case OPT_ansi:
665 if (!c_dialect_cxx ())
666 set_std_c89 (false, true);
667 else
668 set_std_cxx98 (true);
669 break;
670
671 case OPT_d:
672 handle_OPT_d (arg);
673 break;
674
675 case OPT_fcond_mismatch:
676 if (!c_dialect_cxx ())
677 {
678 flag_cond_mismatch = value;
679 break;
680 }
681 /* Fall through. */
682
683 case OPT_fall_virtual:
684 case OPT_falt_external_templates:
685 case OPT_fenum_int_equiv:
686 case OPT_fexternal_templates:
687 case OPT_fguiding_decls:
688 case OPT_fhonor_std:
689 case OPT_fhuge_objects:
690 case OPT_flabels_ok:
691 case OPT_fname_mangling_version_:
692 case OPT_fnew_abi:
693 case OPT_fnonnull_objects:
694 case OPT_fsquangle:
695 case OPT_fstrict_prototype:
696 case OPT_fthis_is_variable:
697 case OPT_fvtable_thunks:
698 case OPT_fxref:
699 case OPT_fvtable_gc:
700 warning ("switch /"%s/" is no longer supported", option->opt_text);
701 break;
702
703 case OPT_faccess_control:
704 flag_access_control = value;
705 break;
706
707 case OPT_fasm:
708 flag_no_asm = !value;
709 break;
710
711 case OPT_fbuiltin:
712 flag_no_builtin = !value;
713 break;
上面如果语言是C++, c_dialect_cxx返回1。并根据其结果设定如下变量:
flag_const_strings(C,C++,-Wwrite-strings)如果非0,字符串常量的类型为`const char *',正如标准所要求。
warn_write_strings(C,C++,-Wwrite-strings)如果非0,警告从字符串常量到`char *'的,这个已过时的转换。
664行处理选项–ansi,它指明代码需要符合的标准。并通过下面的函数保存它的参数。
1522 static void
1523 set_std_c89 (int c94, int iso) in c-opts.c
1524 {
1525 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1526 flag_iso = iso;
1527 flag_no_asm = iso;
1528 flag_no_gnu_keywords = iso;
1529 flag_no_nonansi_builtin = iso;
1530 flag_isoc94 = c94;
1531 flag_isoc99 = 0;
1532 flag_writable_strings = 0;
1533 }
上面,parse_in是cpp_reader的一个全局实例。而函数中涉及的变量如下:
flag_iso,如果非0,摒弃用户名字空间中的宏。
flag_no_asm(C,C++,ObjC,-fno-asm)如果非0,对于C,使用-fno-asm将屏蔽关键字asm,inline和typeof。这个选项对关键字__asm__,__inline__和__typeof__不起作用。对于C++,使用-fno-asm屏蔽关键字typeof,但对asm和inline不起作用,因为它们是语言的一部分。其他会影响这些关键字的选项有-ansi,-gnu-keywords及-std。
flag_no_gnu_keywords(C++,-fno-gnu-keywords)如果非0,屏蔽关键字typeof。
flag_no_nonansi_builtin(C++,-fno-nonansi-builtin)如果非0,表示不识别非ANSI的内建函数(the non-ANSI builtin functions)。由选项-ansi设置。
flag_isoc94,如果非0,表示使能C89修订1的特性。
flag_isoc99,如果非0,表示使用ISO C99。
flag_writable_strings(C,C++,-fwritable-strings)如果非0,保存字符串常量至数据段,这些字符串为不唯一。
1549 static void
1550 set_std_cxx98 (int iso) in c-opts.c
1551 {
1552 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1553 flag_no_gnu_keywords = iso;
1554 flag_no_nonansi_builtin = iso;
1555 flag_iso = iso;
1556 }
在671行,对于选项-dletters,一个或多个字母用于指出何时产生用于调试的转储及转储中包含何物。这个选项用于调试编译器,使得查看编译各阶段的详细信息变为可能。每个输出文件由遍号及跟随的识别字母组成的后缀来区别。例如,在遍21后转储的文件,这个遍是全局寄存器分配,若适时编译doline.c,转储文件名将为doline.21.greg。
-d选项可接之字母,它们可以任意次序任意组合。出于调试编译器的目的,这个特性被严谨地实现。因此你会发现在每个发布版本中,不是所有的字母都被实现了。注意到字母D,I,M和N,在当前版本下,用于预处理器(在4.0版本以后,D,I,M及N需与-E合用,方用于预处理器,否则另有含义)。当前版本中,这些字母的意义如下
字母 |
输出 |
D |
除了在预处理后的普通输出,还输出所有宏定义。 |
I |
预处理器除了普通的预处理输出外,还输出#include指示。 |
M |
在所有预处理输出后,预处理器输出起用的宏定义列表。 |
N |
预处理器除了普通的预处理输出外,还输出以#define name形式的所有宏的列表。 |
1575 static void
1576 handle_OPT_d (const char *arg) in c-opts.c
1577 {
1578 char c;
1579
1580 while ((c = *arg++) != '/0')
1581 switch (c)
1582 {
1583 case 'M': /* Dump macros only. */
1584 case 'N': /* Dump names. */
1585 case 'D': /* Dump definitions. */
1586 flag_dump_macros = c;
1587 break;
1588
1589 case 'I':
1590 flag_dump_includes = 1;
1591 break;
1592 }
1593 }
回到c_common_handle_option,在678行:
flag_cond_mismatch(C,-fcond-mismatch)如果非0,表示允许在条件表达式中不相匹配的类型;并使其值为void。
flag_access_control(C++,-faccess-control)如果非0,表示遵从访问控制语义(access control semantics)。
flag_no_builtin(C,ObjC,-fno-builtin)如果非0,表示不识别非ANSI内建函数。
c_common_handle_option (continue)
715 case OPT_fbuiltin_:
716 if (value)
717 result = 0;
718 else
719 disable_builtin_function (arg);
720 break;
721
722 case OPT_fdollars_in_identifiers:
723 cpp_opts->dollars_in_ident = value;
724 break;
725
726 case OPT_fdump_:
727 if (!dump_switch_p (arg))
728 result = 0;
729 break;
730
731 case OPT_ffreestanding:
732 value = !value;
733 /* Fall through.... */
734 case OPT_fhosted:
735 flag_hosted = value;
736 flag_no_builtin = !value;
737 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
738 if (!value && warn_main == 2)
739 warn_main = 0;
740 break;
在当前版本,仅支持–fno-builtin-function。disabled_builtins保存被屏蔽的内建函数至列表中。
3491 void
3492 disable_builtin_function (const char *name) in c-common.c
3493 {
3494 if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
3495 error ("cannot disable built-in function `%s'", name);
3496 else
3497 {
3498 disabled_builtin *new = xmalloc (sizeof (disabled_builtin));
3499 new->name = name;
3500 new->next = disabled_builtins;
3501 disabled_builtins = new;
3502 }
3503 }
接着,在c_common_handle_option的735行,flag_hosted(C,-fhosted)如果非0,表示所编译出的程序其所运行的环境有完整的标准库,并且main有返回类型int(默认值为1)。
c_common_handle_option (continue)
742 case OPT_fshort_double:
743 flag_short_double = value;
744 break;
745
746 case OPT_fshort_enums:
747 flag_short_enums = value;
748 break;
749
750 case OPT_fshort_wchar:
751 flag_short_wchar = value;
752 break;
753
754 case OPT_fsigned_bitfields:
755 flag_signed_bitfields = value;
756 explicit_flag_signed_bitfields = 1;
757 break;
758
759 case OPT_fsigned_char:
760 flag_signed_char = value;
761 break;
762
763 case OPT_funsigned_bitfields:
764 flag_signed_bitfields = !value;
765 explicit_flag_signed_bitfields = 1;
766 break;
767
768 case OPT_funsigned_char:
769 flag_signed_char = !value;
770 break;
771
772 case OPT_fcheck_new:
773 flag_check_new = value;
774 break;
775
776 case OPT_fconserve_space:
777 flag_conserve_space = value;
778 break;
779
780 case OPT_fconst_strings:
781 flag_const_strings = value;
782 break;
783
784 case OPT_fconstant_string_class_:
785 constant_string_class_name = arg;
786 break;
787
788 case OPT_fdefault_inline:
789 flag_default_inline = value;
790 break;
791
792 case OPT_felide_constructors:
793 flag_elide_constructors = value;
794 break;
795
796 case OPT_fenforce_eh_specs:
797 flag_enforce_eh_specs = value;
798 break;
799
800 case OPT_ffixed_form:
801 case OPT_ffixed_line_length_:
802 /* Fortran front end options ignored when preprocessing only. */
803 if (!flag_preprocess_only)
804 result = 0;
805 break;
806
807 case OPT_ffor_scope:
808 flag_new_for_scope = value;
809 break;
810
811 case OPT_fgnu_keywords:
812 flag_no_gnu_keywords = !value;
813 break;
814
815 case OPT_fgnu_runtime:
816 flag_next_runtime = !value;
817 break;
818
819 case OPT_fhandle_exceptions:
820 warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
821 flag_exceptions = value;
822 break;
823
824 case OPT_fimplement_inlines:
825 flag_implement_inlines = value;
826 break;
827
828 case OPT_fimplicit_inline_templates:
829 flag_implicit_inline_templates = value;
830 break;
831
832 case OPT_fimplicit_templates:
833 flag_implicit_templates = value;
834 break;
835
836 case OPT_fms_extensions:
837 flag_ms_extensions = value;
838 break;
839
840 case OPT_fnext_runtime:
841 flag_next_runtime = value;
842 break;
843
844 case OPT_fnil_receivers:
845 flag_nil_receivers = value;
846 break;
847
848 case OPT_fnonansi_builtins:
849 flag_no_nonansi_builtin = !value;
850 break;
851
852 case OPT_fobjc_exceptions:
853 flag_objc_exceptions = value;
854 break;
855
856 case OPT_foperator_names:
857 cpp_opts->operator_names = value;
858 break;
859
860 case OPT_foptional_diags:
861 flag_optional_diags = value;
862 break;
863
864 case OPT_fpch_deps:
865 cpp_opts->restore_pch_deps = value;
866 break;
867
868 case OPT_fpermissive:
869 flag_permissive = value;
870 break;
871
872 case OPT_fpreprocessed:
873 cpp_opts->preprocessed = value;
874 break;
875
876 case OPT_freplace_objc_classes:
877 flag_replace_objc_classes = value;
878 break;
879
880 case OPT_frepo:
881 flag_use_repository = value;
882 if (value)
883 flag_implicit_templates = 0;
884 break;
885
886 case OPT_frtti:
887 flag_rtti = value;
888 break;
889
890 case OPT_fshow_column:
891 cpp_opts->show_column = value;
892 break;
893
894 case OPT_fstats:
895 flag_detailed_statistics = value;
896 break;
897
898 case OPT_ftabstop_:
899 /* It is documented that we silently ignore silly values. */
900 if (value >= 1 && value <= 100)
901 cpp_opts->tabstop = value;
902 break;
903
904 case OPT_fexec_charset_:
905 cpp_opts->narrow_charset = arg;
906 break;
907
908 case OPT_fwide_exec_charset_:
909 cpp_opts->wide_charset = arg;
910 break;
911
912 case OPT_finput_charset_:
913 cpp_opts->input_charset = arg;
914 break;
915
916 case OPT_ftemplate_depth_:
917 max_tinst_depth = value;
918 break;
919
920 case OPT_fuse_cxa_atexit:
921 flag_use_cxa_atexit = value;
922 break;
923
924 case OPT_fweak:
925 flag_weak = value;
926 break;
927
928 case OPT_fzero_link:
929 flag_zero_link = value;
930 break;
931
932 case OPT_gen_decls:
933 flag_gen_declaration = 1;
934 break;
935
936 case OPT_idirafter:
937 add_path (xstrdup (arg), AFTER, 0);
938 break;
939
940 case OPT_imacros:
941 case OPT_include:
942 defer_opt (code, arg);
943 break;
944
945 case OPT_iprefix:
946 iprefix = arg;
947 break;
948
949 case OPT_isysroot:
950 sysroot = arg;
951 break;
952
953 case OPT_isystem:
954 add_path (xstrdup (arg), SYSTEM, 0);
955 break;
上面,flag_short_double如果非0,表示double和float的大小一致。.
flag_short_enums(-fshort-enums)如果非0,表示只给枚举类型以所需要的大小。
flag_short_wchar(C,C++,-fshort-wchar)如果非0,表示wchar_t和shor大小一致。
flag_signed_bitfields(C,-fsigned-bitfields)如果非0,表示即便位域声明为无符号,也要把它们按有符号处理(默认值为1)。
flag_signed_char(C,-fsigned-char)如果非0,表示char应为有符号。
flag_check_new(C++,-fcheck-new)如果非0,表示需要检查new返回的值,以避免万一为空指针却为其调用构造函数。
flag_conserve_space(C++,-fconserve-space)如果非0,把编译时未初始化的全局变量放入公共段(如C所做)。这会减小可执行文件的大小,因为直至程序被加载前,公共段不分配任何空间。这个选项在绝大部分平台上已不再有用,因为这些平台都已支持把变量加入BSS段,而不需令其为公共。警告:如果使用这个选项导致你的程序在退出时崩溃,这可能是因为对象定义被合并并赋予同一地址,从而导致了2次析构。
flag_default_inline(C++,-fdefault-inline)如果非0表示类中定义的成员函数默认为内联(默认值为1)。
flag_elide_constructors(C++,-felide-constructor)如果非0,调用一个按值返回对象的函数的代码,可以被简化为在指定的返回地址构建对象,而不是使用拷贝构造函数复制在函数中构建的对象。如果构造函数有副作用,这将导致问题(默认值为1)。
flag_enforce_eh_specs(C++,-fenforce-eh-specs)如果非0,表示为异常规范实现标准语义(standard semantics),即调用中不会有不符合规范的异常被抛出。0则表示按断言来处理并相应优化之,但不对其做检查(默认值为1)。
flag_new_for_scope(C++,-ffor-scope),这个设置决定了,在for语句的初始化部分声明的,变量的作用域。指明-ffor-scope则限制这些变量的作用域在循环体内。指明-fno-for-scope 则限制变量作用自声明点至包含for语句的域。下面的例子,在-fno-for-scope选项下,是有效的:
#include <stdio.h>
int main(int argc,char *argv[])
{
for(int i=0; i<10; i++) {
printf("Loop one %d/n",i);
}
printf("Out of loop %d/n",i);
return(0);
}
这个选项目前为默认选项。
flag_implement_inlines(C++,-fimplement-inlines)如果非0,被实现为内联的函数亦有函数体在定义点生成。选项-fno-implement-inlines将压制由#pragma 控制的内联函数的函数体的生成。如果没有函数体生成,对其每次调用必须生成内联代码(默认值为1)。
flag_implicit_inline_templates(C++,-fimplicit-inline-templates)如果非0,表示内联模板的隐式具现(implicit instantiations of inline template)在需要时就被产生,即便非内联模板的具现不是这样(默认值为1)。.
flag_implicit_templates(C++,-fimplicit-templates)如果非0,表示在需要时即可隐式具现模板(默认值为1)。
flag_ms_extensions(C++,-fms-extensions)如果非0,在使用MFC中定义之构件时,禁止诸如,数据声明中的隐式int定义,及通过非标准语法获取指向成员函数的指针等,警告消息。
flag_optional_diags(C++,-foptional-diags)如果非0,表示期望给出标准不要求之诊断信息(默认值为1)。
flag_permissive(C++,-fpermissive)如果非0,为不符合标准的代码发出警告诊断信息,而不是错误消息。如果-fpermissive及-pedantic都没有指明,-fpedantic-errors则被应用。
flag_use_repository(C++,-frepo) 如果非0,表示生成分立的具现控制文件,并在连接时刻利用之。
flag_rtti(C++,-frtti)如果非0,表示为每个包含虚函数类的运行时识别系统生成代码。如果没有使用dynamic_cast及typeid,使用-fno-rtti 来压制这些代码的生成可以为每个类节省空间。这个选项对异常处理不起作用,异常处理必须为rtti产生代码(默认值为1)。
flag_detailed_statistics(C++,-fstats)如果非0,表示显示前端处理的统计信息。这个消息涉及编译器的内部,不影响其输出(默认值为0)。
max_tinst_depth(C++,-ftemplate-depth-number)指明模板最大具现深度。这个限制是相当随意的,设定它是为了察觉无限嵌套的模板具现(默认值为500)。
flag_use_cxa_atexit(C++,-fuse-cxa-atexit)导致全局析构函数以构造函数完成的次序的反序执行,而不是以构造函数开始的次序的反序。只有全局的构造函数在其他全局构造函数中调用,这2个次序才会不同。这个选项只有当C运行时库包括cxa_exit 函数时,才起作用。没有这个选项时,将使用函数atexit。
flag_weak(C++,-fweak)如果非0,表示尽可能将公共类别(common-like)的已定义符号生成为弱符号(weak symbol),以符合C++的语义。否则将其生成为局部符号(local symbol)(默认值为1)。
iprefix,由–iprefix prefix给出的前缀。
sysroot,系统根目录。由–isysroot改写(默认值为NULL)。
c_common_handle_option (continue)
957 case OPT_iwithprefix:
958 add_prefixed_path (arg, SYSTEM);
959 break;
960
961 case OPT_iwithprefixbefore:
962 add_prefixed_path (arg, BRACKET);
963 break;
964
965 case OPT_lang_asm:
966 cpp_set_lang (parse_in, CLK_ASM);
967 cpp_opts->dollars_in_ident = false;
968 break;
969
970 case OPT_lang_objc:
971 cpp_opts->objc = 1;
972 break;
973
974 case OPT_nostdinc:
975 std_inc = false;
976 break;
977
978 case OPT_nostdinc__:
979 std_cxx_inc = false;
980 break;
981
982 case OPT_o:
983 if (!out_fname)
984 out_fname = arg;
985 else
986 error ("output filename specified twice");
987 break;
988
989 /* We need to handle the -pedantic switches here, rather than in
990 c_common_post_options, so that a subsequent -Wno-endif-labels
991 is not overridden. */
992 case OPT_pedantic_errors:
993 cpp_opts->pedantic_errors = 1;
994 /* Fall through. */
995 case OPT_pedantic:
996 cpp_opts->pedantic = 1;
997 cpp_opts->warn_endif_labels = 1;
998 break;
999
1000 case OPT_print_objc_runtime_info:
1001 print_struct_values = 1;
1002 break;
1003
1004 case OPT_remap:
1005 cpp_opts->remap = 1;
1006 break;
1007
1008 case OPT_std_c__98:
1009 case OPT_std_gnu__98:
1010 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
1011 break;
1012
1013 case OPT_std_c89:
1014 case OPT_std_iso9899_1990:
1015 case OPT_std_iso9899_199409:
1016 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
1017 break;
1018
1019 case OPT_std_gnu89:
1020 set_std_c89 (false /* c94 */, false /* ISO */);
1021 break;
1022
1023 case OPT_std_c99:
1024 case OPT_std_c9x:
1025 case OPT_std_iso9899_1999:
1026 case OPT_std_iso9899_199x:
1027 set_std_c99 (true /* ISO */);
1028 break;
1029
1030 case OPT_std_gnu99:
1031 case OPT_std_gnu9x:
1032 set_std_c99 (false /* ISO */);
1033 break;
1034
1035 case OPT_trigraphs:
1036 cpp_opts->trigraphs = 1;
1037 break;
1038
1039 case OPT_traditional_cpp:
1040 cpp_opts->traditional = 1;
1041 break;
1042
1043 case OPT_undef:
1044 flag_undef = 1;
1045 break;
1046
1047 case OPT_w:
1048 cpp_opts->inhibit_warnings = 1;
1049 break;
1050
1051 case OPT_v:
1052 verbose = true;
1053 break;
1054 }
1055
1056 return result;
1057 }
选项–withprefix向头文件查找目录的第二个列表中加入目录名。这个名字通过在目录名字前,附加由-iprefix 指定的前缀构建而得。如果在该选项前,命令行中没有指定前缀,使用编译器的默认包含目录。
为查找头文件,GCC浏览第一个列表中的目录(由-I选项添加的目录)。如果在这第一列表中,找不到头文件,就会查找第二个列表。
而选项–iwithprefixbefore向主包含路径的目录列表中添加名字。这个名字通过在目录名字前,附加由-iprefix 指定的前缀构建而得。如果在该选项前,命令行中没有指定前缀,使用编译器的默认包含目录。
对于这些选项,函数add_prefixed_path被调用。在1399行,cpp_GCC_INCLUDE_DIR对于x86/Linux目标平台为””,它在iprefix无设定时使用。
1391 static void
1392 add_prefixed_path (const char *suffix, size_t chain) in c-opts.c
1393 {
1394 char *path;
1395 const char *prefix;
1396 size_t prefix_len, suffix_len;
1397
1398 suffix_len = strlen (suffix);
1399 prefix = iprefix ? iprefix: cpp_GCC_INCLUDE_DIR;
1400 prefix_len = iprefix? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1401
1402 path = xmalloc (prefix_len + suffix_len + 1);
1403 memcpy (path, prefix, prefix_len);
1404 memcpy (path + prefix_len, suffix, suffix_len);
1405 path[prefix_len + suffix_len] = '/0';
1406
1407 add_path (path, chain, 0);
1408 }
上面c_common_handle_option的965行,对于选项–lang-asm,域dollars_in_ident如果非0,表示美元符号也是标点(punctuation)。
对于其他选项:
std_inc(-nostdinc),如果为0,阻止编译器在标准系统目录中查找头文件。被查找的目录仅包括当前及由-I选项指定的目录。
std_cxx_inc(-nostdinc++),如果为0,阻止编译器在标准C++目录中查找头文件,但在其他标准目录中继续其查找。这个选项特别用于C++库的编译。
out_fname(-o filename),将输出写命名的文件。无论产生何种输出,这个选项皆可应用;它可以是预处理输出,汇编代码,一个目标文件或者一个完成链接的执行文件。因为只可以指定一个输出文件,如果有多个文件产生,就不应使用-o选项。如果编译器产生完成链接的执行文件,而没有使用-o选项指定文件名,默认的文件名为a.out。
-pedantic-errors,这个选项与-pedantic相同,除了诊断信息作为错误发出而不是警告。对于C++,如果-fpermissive或-pedantic选项都没指定,就应用-fpedantic-errors选项。
-pedantic,按严格符合C和C++ ISO标准的要求,进行警告。没有这个选项,GNU扩展将被使能,但符合ISO的程序仍可以成功编译(虽然一些要求-ansi选项)。对于C,所应用的标准由-std选项指定。如果-std指定了gnu89,那么-pedantic适用C89的规则。选项-pedantic仅发出ISO标准要求的诊断消息,因此有可能代码不符合标准但没有警告发出。GCC尚无计划实现强制严格符合标准的选项。对于C,选项-pedantic不适用于任何跟在__extension__后的表达式。
对于C++,如果-fpermissive或-pedantic选项都没指定,就应用-fpedantic-errors选项。
在1004行,-remap,这个选项指引预处理器,在每个包含包含文件的目录中,检查名为header.gcc的文件是否存在。如果该文件存在,它用于确定被查找文件的真实名字。这个文件的每一行包含被查找的头文件名,后跟真实的文件名。例如,在header.gcc中,下列行将使得,具有长名字的头文件,通过较短的名字来找到:
NotSupportedException.h notsup.h
RollbackException.h rollbak.h
TransactionRequiredException.h transreq.h
-trigraphs,支持ISO C的三元符(trigraph)。这个选项由-ansi和-std暗中打开。在这个消息打开时,构成9个三元符的每个3字符序列(以??开头)将,根据下表,被解释为单个字符:
??= # ??( [ ??< {
??/ / ??) ] ??> }
??' ^ ??! | ??- ~
flag_undef(-undef),如果非0,预处理器不预先定义任何非标准的宏。这个选项压制了诸如__unix__,__OpenBSD__,__mips__,__linux__,__vax__等这样的架构定义。
-w,不要产生警告信息。等同于--no-warnings。
Verbose(-v),如果非0,显示编译器的当前版本,及显示运行各编译阶段和链接处理的所有命令。当单独使用时,这个选项显示编译器的当前版本号。当与—help选项连用时,显示完整的命令行选项列表。
回到handle_option,c_common_handle_option如果成功完成了选项的处理,将返回1。而对于不可识别的选项,结果依赖于permit_fortran_options,这个变量在c_common_init_options中由-traditional-cpp设定。若返回0将需要继续以下的处理。