天天看點

GCC-3.4.6源代碼學習筆記(25續2)

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       

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':                 

1584       case 'N':                  

1585       case 'D':                  

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       

734      case OPT_fhosted:

735        flag_hosted = value;

736        flag_no_builtin = !value;

737       

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        

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        

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      

992       case OPT_pedantic_errors:

993         cpp_opts->pedantic_errors = 1;

994        

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 );

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 , true );

1017       break;

1018

1019     case OPT_std_gnu89:

1020       set_std_c89 (false , false );

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 );

1028       break;

1029

1030     case OPT_std_gnu99:

1031     case OPT_std_gnu9x:

1032       set_std_c99 (false );

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将需要继续以下的处理。

Â