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

问题描述 投票:1回答:1

[无论使用#ifndef还是#pragma once,编译器都了解防护措施。并且每个头文件(.h / .hpp)都应该有一个防护。也许某些意图包含多个.inc文件的异常。

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

gcc g++ compiler-warnings guard
1个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.