Переключатель gcc -Wc++0x-compat используется для кода C

Я пытаюсь использовать как можно больше переключателей предупреждений gcc, чтобы выяснить, помогают ли они сделать мой код чище или даже найти проблемы.

Я использую эти предупреждающие переключатели для C:

warnings_common = ['-Werror', '-Wfatal-errors', '-Wpedantic', '-pedantic', '-pedantic-errors', '-Wall', '-Wextra', '-Wchar-subscripts', '-Wcomment', '-Wno-coverage-mismatch', '-Wno-cpp', '-Wdouble-promotion', '-Wformat', '-Wnonnull', '-Winit-self', '-Wimplicit-int', '-Wimplicit-function-declaration', '-Wimplicit', '-Wignored-qualifiers', '-Wmain', '-Wmissing-braces', '-Wmissing-include-dirs', '-Wparentheses', '-Wsequence-point', '-Wno-return-local-addr', '-Wreturn-type', '-Wswitch', '-Wswitch-default', '-Wswitch-enum', '-Wsync-nand', '-Wtrigraphs', '-Wunused-but-set-parameter', '-Wunused-but-set-variable', '-Wunused-function', '-Wunused-label', '-Wunused-local-typedefs', '-Wunused-parameter', '-Wno-unused-result', '-Wunused-variable', '-Wunused-value', '-Wunused', '-Wuninitialized', '-Wmaybe-uninitialized', '-Wunknown-pragmas', '-Wno-pragmas', '-Wstrict-aliasing', '-Wstrict-overflow', '-Warray-bounds', '-Wno-div-by-zero', '-Wsystem-headers', '-Wtrampolines', '-Wfloat-equal', '-Wtraditional', '-Wtraditional-conversion', '-Wdeclaration-after-statement', '-Wundef', '-Wno-endif-labels', '-Wshadow', '-Wno-free-nonheap-object', '-Wunsafe-loop-optimizations', '-Wno-pedantic-ms-format', '-Wpointer-arith', '-Wtype-limits', '-Wbad-function-cast', '-Wc++-compat', '-Wc++11-compat', '-Wcast-qual', '-Wcast-align', '-Wwrite-strings', '-Wclobbered', '-Wconversion', '-Wempty-body', '-Wenum-compare', '-Wjump-misses-init', '-Wsign-compare', '-Wsign-conversion', '-Wsizeof-pointer-memaccess', '-Waddress', '-Wlogical-op', '-Waggregate-return', '-Wno-aggressive-loop-optimizations', '-Wno-attributes', '-Wno-builtin-macro-redefined', '-Wstrict-prototypes', '-Wold-style-declaration', '-Wold-style-definition', '-Wmissing-parameter-type', '-Wmissing-prototypes', '-Wmissing-declarations', '-Wmissing-field-initializers', '-Wno-multichar', '-Wno-deprecated', '-Wno-deprecated-declarations', '-Wno-overflow', '-Woverride-init', '-Wpacked', '-Wpacked-bitfield-compat', '-Wpadded', '-Wredundant-decls', '-Wnested-externs', '-Winline', '-Wno-int-to-pointer-cast', '-Wno-pointer-to-int-cast', '-Winvalid-pch', '-Wlong-long', '-Wvariadic-macros', '-Wvarargs', '-Wvector-operation-performance', '-Wvla', '-Wvolatile-register-var', '-Wdisabled-optimization', '-Wpointer-sign', '-Wstack-protector', '-Woverlength-strings', '-Wunsuffixed-float-constants']

но я получаю эту ошибку:

cc1: error: command line option '-Wc++0x-compat' is valid for C++/ObjC++ but not for C [-Werror]

что кажется странным, так как я компилирую файл C:

int main(void);

int main(void) {
  return 0;
}

Какой переключатель из приведенных выше вызывает «-Wc++0x-compat» и почему?


person João M. S. Silva    schedule 09.01.2014    source источник
comment
-Wall вызывает это, я не знаю, делают ли другие флаги, но Wall точно. gcc.gnu.org/onlinedocs/gcc-4.3. 6/gcc/Warning-Options.html   -  person user2485710    schedule 09.01.2014
comment
Попробуйте удалить '-Wc++11-compat'. c++0x — это старое имя для c++11.   -  person woolstar    schedule 09.01.2014
comment
Woolstar дал правильный ответ, но вы знаете, вы могли бы попробовать удалить флаги, пока ошибка не исчезнет ...   -  person Marc Glisse    schedule 09.01.2014
comment
Хорошо, я просматривал gcc.gnu.org/onlinedocs/gcc/Warning- Options.html, в котором не упоминается "-Wc++0x-compat". Также на справочной странице gcc этот переключатель не упоминается. Я использую версию 4.8.1.   -  person João M. S. Silva    schedule 09.01.2014
comment
@user2242584 user2242584 Я повторяю совет Woolstar: удалить -Wc++11-compat из списка.   -  person Ali    schedule 09.01.2014
comment
@woolstar На справочной странице «-Wc++11-compat» указан в общих параметрах предупреждения (поэтому он должен поддерживаться для C), но в его описании указано только для C++ и Objective-C++.   -  person João M. S. Silva    schedule 09.01.2014
comment
@MarcGlisse Я сделал это, но только для тех параметров, для которых указанный компилятор действителен для --- но не для C.   -  person João M. S. Silva    schedule 09.01.2014
comment
Удаление «-Wc++11-compat» сработало. Я не думаю, что «-Wall» вызывает это, по крайней мере, в версии 4.8.1, поскольку не имеет смысла запускать переключатели, отличные от C. Вероятно, в gcc есть небольшая ошибка: вместо того, чтобы жаловаться на переключатель, указанный в командной строке, он жаловался на переключатель, вызванный переключателем в командной строке.   -  person João M. S. Silva    schedule 09.01.2014


Ответы (1)


В gcc (и других компиляторах) некоторые флаги являются просто заполнителями для большего набора флагов, например -Wall, вы можете прочитать о флагах в документация gcc.

Если вы хотите отключить определенный флаг, используйте префикс -Wno, например -Wno-c++0x-compat, если вы хотите отключить только этот.

person user2485710    schedule 09.01.2014
comment
Я пробовал это, но cc1: error: параметр командной строки '-Wno-c++0x-compat' действителен для C++/ObjC++, но не для C [-Werror] - person João M. S. Silva; 09.01.2014