GCC-3.4.6源代码学习笔记(25续1)

c_common_handle_option (continue)

 

401     case OPT_Wbad_function_cast:

402        warn_bad_function_cast = value;

403        break;

404 

405      case OPT_Wcast_qual:

406        warn_cast_qual = value;

407        break;

408 

409      case OPT_Wchar_subscripts:

410        warn_char_subscripts = value;

411        break;

412 

413      case OPT_Wcomment:

414      case OPT_Wcomments:

415        cpp_opts->warn_comments = value;

416        break;

417 

418      case OPT_Wconversion:

419        warn_conversion = value;

420        break;

421 

422      case OPT_Wctor_dtor_privacy:

423        warn_ctor_dtor_privacy = value;

424        break;

425 

426      case OPT_Wdeclaration_after_statement:

427        warn_declaration_after_statement = value;

428        break;

429 

430      case OPT_Wdeprecated:

431        warn_deprecated = value;

432        cpp_opts->warn_deprecated = value;

433        break;

434 

435      case OPT_Wdiv_by_zero:

436        warn_div_by_zero = value;

437        break;

438 

439      case OPT_Weffc__:

440        warn_ecpp = value;

441        break;

442 

443      case OPT_Wendif_labels:

444        cpp_opts->warn_endif_labels = value;

445        break;

446 

447      case OPT_Werror:

448        cpp_opts->warnings_are_errors = value;

449        break;

450 

451      case OPT_Werror_implicit_function_declaration:

452        mesg_implicit_function_declaration = 2;

453        break;

454 

455      case OPT_Wfloat_equal:

456        warn_float_equal = value;

457        break;

458 

459      case OPT_Wformat:

460        set_Wformat (value);

461        break;

462 

463      case OPT_Wformat_:

464        set_Wformat (atoi (arg));

465        break;

466 

467      case OPT_Wformat_extra_args:

468        warn_format_extra_args = value;

469        break;

470 

471      case OPT_Wformat_nonliteral:

472        warn_format_nonliteral = value;

473        break;

474 

475      case OPT_Wformat_security:

476        warn_format_security = value;

477        break;

478 

479      case OPT_Wformat_y2k:

480        warn_format_y2k = value;

481        break;

482 

483      case OPT_Wformat_zero_length:

484        warn_format_zero_length = value;

485        break;

486 

487      case OPT_Winit_self:

488        warn_init_self = value;

489        break;

490 

491      case OPT_Wimplicit:

492        set_Wimplicit (value);

493        break;

494 

495      case OPT_Wimplicit_function_declaration:

496        mesg_implicit_function_declaration = value;

497        break;

498 

499      case OPT_Wimplicit_int:

500        warn_implicit_int = value;

501        break;

502 

503      case OPT_Wimport:

504        /* Silently ignore for now.  */

505        break;

506 

507      case OPT_Winvalid_offsetof:

508        warn_invalid_offsetof = value;

509        break;

510 

511      case OPT_Winvalid_pch:

512        cpp_opts->warn_invalid_pch = value;

513        break;

514 

515      case OPT_Wlong_long:

516        warn_long_long = value;

517        break;

518 

519      case OPT_Wmain:

520        if (value)

521          warn_main = 1;

522        else

523          warn_main = -1;

524        break;

525 

526      case OPT_Wmissing_braces:

527        warn_missing_braces = value;

528        break;

529 

530      case OPT_Wmissing_declarations:

531        warn_missing_declarations = value;

532        break;

533 

534      case OPT_Wmissing_format_attribute:

535        warn_missing_format_attribute = value;

536        break;

537 

538      case OPT_Wmissing_prototypes:

539        warn_missing_prototypes = value;

540        break;

541 

542      case OPT_Wmultichar:

543        cpp_opts->warn_multichar = value;

544        break;

545 

546      case OPT_Wnested_externs:

547        warn_nested_externs = value;

548        break;

549 

550      case OPT_Wnon_template_friend:

551        warn_nontemplate_friend = value;

552        break;

553 

554      case OPT_Wnon_virtual_dtor:

555        warn_nonvdtor = value;

556        break;

557 

558      case OPT_Wnonnull:

559        warn_nonnull = value;

560        break;

561 

562      case OPT_Wold_style_definition:

563        warn_old_style_definition = value;

564        break;

565 

566      case OPT_Wold_style_cast:

567        warn_old_style_cast = value;

568        break;

569 

570      case OPT_Woverloaded_virtual:

571        warn_overloaded_virtual = value;

572        break;

573 

574      case OPT_Wparentheses:

575        warn_parentheses = value;

576        break;

577 

578      case OPT_Wpmf_conversions:

579        warn_pmf2ptr = value;

580        break;

581 

582      case OPT_Wpointer_arith:

583        warn_pointer_arith = value;

584        break;

585 

586      case OPT_Wprotocol:

587        warn_protocol = value;

588        break;

589 

590      case OPT_Wselector:

591        warn_selector = value;

592        break;

593 

594      case OPT_Wredundant_decls:

595        warn_redundant_decls = value;

596        break;

597 

598      case OPT_Wreorder:

599        warn_reorder = value;

600        break;

601 

602      case OPT_Wreturn_type:

603        warn_return_type = value;

604        break;

605 

606      case OPT_Wsequence_point:

607        warn_sequence_point = value;

608        break;

609 

610      case OPT_Wsign_compare:

611        warn_sign_compare = value;

612        break;

613 

614      case OPT_Wsign_promo:

615        warn_sign_promo = value;

616        break;

617 

618      case OPT_Wstrict_prototypes:

619        warn_strict_prototypes = value;

620        break;

621 

622      case OPT_Wsynth:

623        warn_synth = value;

624        break;

625 

626      case OPT_Wsystem_headers:

627        cpp_opts->warn_system_headers = value;

628        break;

629 

630      case OPT_Wtraditional:

631        warn_traditional = value;

632        cpp_opts->warn_traditional = value;

633        break;

634 

635      case OPT_Wtrigraphs:

636        cpp_opts->warn_trigraphs = value;

637        break;

638 

639      case OPT_Wundeclared_selector:

640        warn_undeclared_selector = value;

641        break;

642 

643      case OPT_Wundef:

644        cpp_opts->warn_undef = value;

645        break;

646 

647      case OPT_Wunknown_pragmas:

648        /* Set to greater than 1, so that even unknown pragmas in

649          system headers will be warned about.  */

650        warn_unknown_pragmas = value * 2;

651        break;

652 

653      case OPT_Wunused_macros:

654        warn_unused_macros = value;

655        break;

 

上述代码片段,其中变量的细节如下

warn_bad_function_castC-Wbad-function-cast)如果非0,警告转换函数返回类型至不相配类型。例如,以下代码中的函数调用将导致警告:

int glim() {    

return(88);

}

. . .

char *cp;

cp = (char *)glim();

warn_cast_qualCC++ObjC-Wcast-qual)如果非0,警告一个会丢失限定符的函数调用。例如,以下代码将丢失const限定符:

const char *conchp;

char *chp;

. . .

chp = (char *)conchp;

warn_conversionCC++ObjC-Wconversion)如果非0,警告一个原型(prototype),比之该原型不出现时,导致一个额外的类型转换。这包括浮点与整型类型间,有符号与无符号数据间,及改变数据大小的转换。仅为隐式转换产生警告(implicit conversion),类型强制转换不涉及。例如,下面代码中,第一个赋值语句会触发警告,但第二个不会:

unsigned int recp;

recp = -1;

recp = (unsigned int)-1;

warn_ctor_dtor_privacyC++-Wctor-dtor-privacy,也由-Wall设置)如果非0,警告一个类看上去不可用,因为它只包含私有的构造或析构函数,没有友元,及没有公有或静态成员。

warn_deprecatedC++-Wdeprecated)如果非0,表示抱怨已过时的特性(默认值为1)。

warn_div_by_zero-Wdiv-by-zero)如果非0,警告编译时的除0计算。但对于浮点除0不警告(默认值为1)。

warn_ecppC++-Weffc++)如果非0,警告违反了Scott Myers的书Effective C++给出的某些风格指引。标准库头文件不遵从这些指引,因此你也会得到由它们触发的警告。

warn_float_equal-Wfloat-equal),如果2个浮点数比较是否相等,给出警告,因为这通常是程序里的一个逻辑错误。出于浮点算术的本质,计算得到的浮点数很少能等于另一个。这意味着比较2个浮点数,完全相等基本上都不成立,即便从程序逻辑来说,这2个数已足够接近可认为相等。下面的技巧用于比较浮点数,如果你的程序认为2者的差别在0.00001以内可视为相等。

double delta = 0.00001;

. . .

if((val1 > val2-delta) && (val1 < val2+delta) {

/* val1 and val2 are considered equal */

}

warn_init_self-Winit-self)如果非0,警告未初始化的变量自己初始化自己。例如:int i = i;

warn_invalid_offsetof-Winvalid-offsetof)如果非0,警告对offset的无效使用(默认值是1)。

warn_long_longCC++ObjC-Wlong-long)如果非0而且使用了-pedantic,警告long long 的使用(默认值是1)。

warn_missing_declarationsC-Wmissing-declarations)如果非0,警告任一没有另外事先声明的全局函数定义。

warn_missing_format_attributeCC++ObjC-Wmissing-format-attribute)如果非0,警告可能是格式属性的候选者。注意到这个警告也对可能不返回的候选者发出。这个选项除非-Wformat-Wall也在使用,否则不起作用。

warn_missing_prototypesC-Wmissing-prototype)如果非0,警告任一没有另外事先原型声明的全局函数定义。

warn_nested_externsC-Wnested-externs)如果非0,警告在一个函数内的外部声明。

warn_old_style_definition-Wold-style-definition)如果非0,警告旧式的参数声明。

warn_old_style_castC++-Wold-style-cast)如果非0,警告使用一个传统的类型转换(C语言风格),而不是使用强制转换操作符static_castconst_castreinterpret_castC++标准的新形式。例如:

class A { ... };

class B: public A { ... };

. . .

A* a = new A();

B* b = a; //implicit conversion

A* a2 = static_cast<A*>(b); //reversing an implicit conversion

warn_overloaded_virtualC++-Woverloaded-virtual)如果非0,警告一个函数声明屏蔽了基类中的一个虚函数声明。在以下例子,类A中的函数fn被屏蔽:

class A {

virtual void fn();

};

class B: public A {

void fn(int);

};

warn_pmf2ptrC++-Wpmf-conversions)如果非0,警告将成员函数指针转换为指向void或函数的指针(默认值是1)。

warn_pointer_arithCC++ObjC-Wpointer-arith)如果非0,警告任一依赖函数类型大小或void类型大小的情况。出于指针算术的目的,GCC默认这些项的大小为1

warn_redundant_declsCC++ObjC-Wredundant-decls)如果非0,警告对变量或函数的重复声明。

warn_sign_promoC++-Wsign-prom)如果非0,警告一个无符号(或枚举)类型到同样大小的有符号类型的重载。标准指出了这类转换,它可能导致数据丢失。

warn_synthC++-Wsynth)如果非0,警告合成的操作符与cfront产生的不同。在下面的例子中,GCC将合成出操作符A& operator = (const A&);cfront使用用户定义的操作符A& operator = (int);

class A {

operator int();

A& operator = (int);

};

main() {

A a1;

A a2;

a1 = a2;

}

warn_traditionalC-Wtraditional) 如果非0,警告相对于标准C,传统C可能有不同的含义或不存在。它们中的一些是具有二义性的,或者是存在问题的构建,应当避免。

Ÿ        在宏实体内的字符串字面中的宏参数。在传统C的宏替换通过字符串字面方式完成,但ISO C不是这样。

Ÿ        在传统C中,一些预处理指示不存在。传统预处理器只有’#’出现在第1列,才认为这行是指示。因此‘-Wtraditional’警告那些传统C能识别,但因为’#’不出现在第1列而被忽略的指示。这也意味着可以通过缩进,隐藏传统C所不能识别的指示,如 ‘#pragma’。某些传统C的实现还不能识别‘#elif’,因此建议一并避免之。

Ÿ        没有参数的函数形式的宏。

Ÿ        一元加操作符。

Ÿ        U’整型常量后缀,或‘F’‘L’浮点常量后缀。(传统C不支持整型常量带‘L’后缀)。注意,这些后缀出现在大部分现代系统的系统头文件的宏定义中,比如,<limits.h>中的宏‘_MIN’/’_MAX’。在用户代码中使用这些宏可能导致伪警告,不过GCC的集成预处理器有足够的上下文来避免这些警告。

Ÿ        在一个块中声明的外部函数并在块后用之。

Ÿ        一个有long类型操作数的switch语句。

Ÿ        一个非静态函数声明跟在静态的声明后。某些传统C编译器不能接受这个构造。

Ÿ        一个整型常量的ISO类型与其传统类型有不同的大小及符号。这个警告只针对10进制的常量。16进制或8进制数通常表示位的模式,不为其发出警告。

Ÿ        使用ISO字符串级联(concatenation)。

Ÿ        自动聚集类型对象的初始化。

Ÿ        标识符(identifier)与标签(label)同名。传统C对标签不使用另外的名字空间。

Ÿ        Union的初始化。如果初始化值为0,警告被省略。这是假定用户代码中,0初始化值出现于特定的情况下,如__STDC__,以避免产生无初始化值的警告,并依赖传统C默认用0初始化。

Ÿ        通过原型的浮点/非浮点数的转换(conversions by prototypes between fixed/floating point values and vice versa)。在编译传统C时,原型的缺失会导致严重的问题。这只是所有可能的转换警告的一部分。使用‘-Wtraditional-conversion’能报出的所有转换警告。

Ÿ        使用ISO C风格函数定义。这个警告故意不用于原型声明或可变参数函数,因为当在你的代码中使用libiberty的与传统C兼容的宏,PARAMSVPARAMS时,会用到这些ISO C的特性。这个警告也会绕过嵌套函数(nested function),因为这个特性已经是GCC的扩展,与传统C的兼容性无关。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值