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_cast(C,-Wbad-function-cast)如果非0,警告转换函数返回类型至不相配类型。例如,以下代码中的函数调用将导致警告:
int glim() {
return(88);
}
. . .
char *cp;
cp = (char *)glim();
warn_cast_qual(C,C++,ObjC,-Wcast-qual)如果非0,警告一个会丢失限定符的函数调用。例如,以下代码将丢失const限定符:
const char *conchp;
char *chp;
. . .
chp = (char *)conchp;
warn_conversion(C,C++,ObjC,-Wconversion)如果非0,警告一个原型(prototype),比之该原型不出现时,导致一个额外的类型转换。这包括浮点与整型类型间,有符号与无符号数据间,及改变数据大小的转换。仅为隐式转换产生警告(implicit conversion),类型强制转换不涉及。例如,下面代码中,第一个赋值语句会触发警告,但第二个不会:
unsigned int recp;
recp = -1;
recp = (unsigned int)-1;
warn_ctor_dtor_privacy(C++,-Wctor-dtor-privacy,也由-Wall设置)如果非0,警告一个类看上去不可用,因为它只包含私有的构造或析构函数,没有友元,及没有公有或静态成员。
warn_deprecated(C++,-Wdeprecated)如果非0,表示抱怨已过时的特性(默认值为1)。
warn_div_by_zero(-Wdiv-by-zero)如果非0,警告编译时的除0计算。但对于浮点除0不警告(默认值为1)。
warn_ecpp(C++,-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_long(C,C++,ObjC,-Wlong-long)如果非0而且使用了-pedantic,警告long long 的使用(默认值是1)。
warn_missing_declarations(C,-Wmissing-declarations)如果非0,警告任一没有另外事先声明的全局函数定义。
warn_missing_format_attribute(C,C++,ObjC,-Wmissing-format-attribute)如果非0,警告可能是格式属性的候选者。注意到这个警告也对可能不返回的候选者发出。这个选项除非-Wformat或-Wall也在使用,否则不起作用。
warn_missing_prototypes(C,-Wmissing-prototype)如果非0,警告任一没有另外事先原型声明的全局函数定义。
warn_nested_externs(C,-Wnested-externs)如果非0,警告在一个函数内的外部声明。
warn_old_style_definition(-Wold-style-definition)如果非0,警告旧式的参数声明。
warn_old_style_cast(C++,-Wold-style-cast)如果非0,警告使用一个传统的类型转换(C语言风格),而不是使用强制转换操作符static_cast,const_cast或reinterpret_cast的C++标准的新形式。例如:
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_virtual(C++,-Woverloaded-virtual)如果非0,警告一个函数声明屏蔽了基类中的一个虚函数声明。在以下例子,类A中的函数fn被屏蔽:
class A {
virtual void fn();
};
class B: public A {
void fn(int);
};
warn_pmf2ptr(C++,-Wpmf-conversions)如果非0,警告将成员函数指针转换为指向void或函数的指针(默认值是1)。
warn_pointer_arith(C,C++,ObjC,-Wpointer-arith)如果非0,警告任一依赖函数类型大小或void类型大小的情况。出于指针算术的目的,GCC默认这些项的大小为1。
warn_redundant_decls(C,C++,ObjC,-Wredundant-decls)如果非0,警告对变量或函数的重复声明。
warn_sign_promo(C++,-Wsign-prom)如果非0,警告一个无符号(或枚举)类型到同样大小的有符号类型的重载。标准指出了这类转换,它可能导致数据丢失。
warn_synth(C++,-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_traditional(C,-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兼容的宏,PARAMS和VPARAMS时,会用到这些ISO C的特性。这个警告也会绕过嵌套函数(nested function),因为这个特性已经是GCC的扩展,与传统C的兼容性无关。