我可以告诉gcc / g ++警告缺少头保护吗?

时间:2019-12-27 08:32:40

标签: gcc g++ compiler-warnings guard

无论是使用#ifndef还是#pragma once,编译器都能理解防护措施。而且每个头文件(.h / .hpp)都应有一个保护措施。对于某些可能打算不只包含一次的.inc文件,可能是例外。

如果缺少这样的防护措施,是否有一些编译器选项会发出警告(甚至是错误)?当然可以grep,但是我更喜欢内置的。

1 个答案:

答案 0 :(得分:1)

如果您使用-H选项列出包含的标头,则编译器还会建议使用“标头防护”可以使哪些标头受益。

例如,在运行macOS 10.14.6 Mojave的Mac上(不问),我进行了编译并获得了输出:

$ gcc -std=c11 -Wall -Wmissing-prototypes -Wstrict-prototypes -Wextra -pedantic -Werror -g -O3 -H -I/Users/jonathanleffler/inc -c ngxgetopt.c
. ngxintern.h
.. ngxgetopt.h
... /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include-fixed/stdio.h
.... /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include/stdarg.h
.... /usr/include/_stdio.h
..... /usr/include/sys/cdefs.h
...... /usr/include/sys/_symbol_aliasing.h
...... /usr/include/sys/_posix_availability.h
..... /usr/include/Availability.h
...... /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include-fixed/AvailabilityInternal.h
..... /usr/include/_types.h
...... /usr/include/sys/_types.h
....... /usr/include/machine/_types.h
........ /usr/include/i386/_types.h
....... /usr/include/sys/_pthread/_pthread_types.h
..... /usr/include/sys/_types/_va_list.h
...... /usr/include/machine/types.h
....... /usr/include/i386/types.h
........ /usr/include/sys/_types/_int8_t.h
........ /usr/include/sys/_types/_int16_t.h
........ /usr/include/sys/_types/_int32_t.h
........ /usr/include/sys/_types/_int64_t.h
........ /usr/include/sys/_types/_u_int8_t.h
........ /usr/include/sys/_types/_u_int16_t.h
........ /usr/include/sys/_types/_u_int32_t.h
........ /usr/include/sys/_types/_u_int64_t.h
........ /usr/include/sys/_types/_intptr_t.h
......... /usr/include/machine/types.h
........ /usr/include/sys/_types/_uintptr_t.h
..... /usr/include/sys/_types/_size_t.h
..... /usr/include/sys/_types/_null.h
..... /usr/include/sys/stdio.h
.... /usr/include/sys/_types/_off_t.h
.... /usr/include/sys/_types/_ssize_t.h
.... /usr/include/secure/_stdio.h
..... /usr/include/secure/_common.h
.. /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include-fixed/limits.h
... /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include-fixed/syslimits.h
.... /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include-fixed/limits.h
..... /usr/include/limits.h
...... /usr/include/machine/limits.h
....... /usr/include/i386/limits.h
........ /usr/include/i386/_limits.h
...... /usr/include/sys/syslimits.h
. /Users/jonathanleffler/inc/debug.h
.. /Users/jonathanleffler/inc/kludge.h
. /Users/jonathanleffler/inc/gcd.h
. /Users/jonathanleffler/inc/stderr.h
.. /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include/stdarg.h
. /Users/jonathanleffler/inc/strdotfill.h
.. /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include/stddef.h
. /usr/include/assert.h
. /usr/include/ctype.h
.. /usr/include/_ctype.h
... /usr/include/runetype.h
.... /usr/include/sys/_types/_ct_rune_t.h
.... /usr/include/sys/_types/_rune_t.h
.... /usr/include/sys/_types/_wchar_t.h
.... /usr/include/sys/_types/_wint_t.h
. /usr/include/errno.h
.. /usr/include/sys/errno.h
. /usr/include/inttypes.h
.. /usr/include/sys/_types/_wchar_t.h
.. /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include/stdint.h
... /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include-fixed/stdint.h
.... /usr/include/_types/_uint8_t.h
.... /usr/include/_types/_uint16_t.h
.... /usr/include/_types/_uint32_t.h
.... /usr/include/_types/_uint64_t.h
.... /usr/include/_types/_intmax_t.h
.... /usr/include/_types/_uintmax_t.h
. /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include-fixed/limits.h
. /opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include-fixed/math.h
. /usr/include/stdlib.h
.. /usr/include/sys/wait.h
... /usr/include/sys/_types/_pid_t.h
... /usr/include/sys/_types/_id_t.h
... /usr/include/sys/signal.h
.... /usr/include/sys/appleapiopts.h
.... /usr/include/machine/signal.h
..... /usr/include/i386/signal.h
.... /usr/include/machine/_mcontext.h
..... /usr/include/i386/_mcontext.h
...... /usr/include/mach/machine/_structs.h
....... /usr/include/mach/i386/_structs.h
.... /usr/include/sys/_pthread/_pthread_attr_t.h
.... /usr/include/sys/_types/_sigaltstack.h
.... /usr/include/sys/_types/_ucontext.h
..... /usr/include/machine/_mcontext.h
.... /usr/include/sys/_types/_sigset_t.h
.... /usr/include/sys/_types/_uid_t.h
... /usr/include/sys/resource.h
.... /usr/include/sys/_types/_timeval.h
... /usr/include/machine/endian.h
.... /usr/include/i386/endian.h
..... /usr/include/sys/_endian.h
...... /usr/include/libkern/_OSByteOrder.h
....... /usr/include/libkern/i386/_OSByteOrder.h
.. /usr/include/alloca.h
.. /usr/include/sys/_types/_wchar_t.h
.. /usr/include/malloc/_malloc.h
.. /usr/include/sys/_types/_dev_t.h
.. /usr/include/sys/_types/_mode_t.h
. /usr/include/string.h
.. /usr/include/strings.h
... /usr/include/string.h
... /usr/include/secure/_strings.h
.. /usr/include/secure/_string.h

和警告:

Multiple include guards may be useful for:
/opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include-fixed/syslimits.h
/opt/gcc/v9.2.0/lib/gcc/x86_64-apple-darwin18.7.0/9.2.0/include/stddef.h
/usr/include/assert.h
/usr/include/errno.h
/usr/include/machine/limits.h
/usr/include/secure/_stdio.h
/usr/include/secure/_string.h
/usr/include/secure/_strings.h
/usr/include/sys/_posix_availability.h
/usr/include/sys/_symbol_aliasing.h

我不打算更改系统头,但是这里有信息。