Отключить ошибку объявления функции в avr g++

Я использую этот Makefile для компиляции моего Arduino. эскизы, которые имеют следующие флаги для CPP и C

CPPFLAGS      += -mmcu=$(MCU) -DF_CPU=$(F_CPU) -DARDUINO=$(ARDUINO_VERSION) \
            -I. -I$(ARDUINO_CORE_PATH) -I$(ARDUINO_VAR_PATH)/$(VARIANT) \
            $(SYS_INCLUDES) $(USER_INCLUDES) -g -Os -w -Wall \
            -ffunction-sections -fdata-sections
CFLAGS        = -std=gnu99
CXXFLAGS      = -fno-exceptions

когда я компилирую файл cpp, я получаю фатальную ошибку, если функции используются до их объявления. Я просмотрел параметры avr g++ и обнаружил, что параметр -Wimplicit-function- декларация разрешает это. Также он включается опцией -Wall, которая используется в make-файле.

Я хочу включить опцию -Wall (поскольку она включает множество других предупреждений), но отключить только опцию -Wimplicit-function-declaration.

Я проверил документацию, но не мог понять, как это сделать. Может ли кто-нибудь любезно сказать мне, как это сделать?


person Sudar    schedule 05.08.2012    source источник
comment
Мне нужно скомпилировать код Arduino. По умолчанию Arduino IDE не принуждает к этому, из-за чего большинство скетчей Arduino не объявляют функции. Я объявляю все свои функции, прежде чем использовать их в новом коде, который я пишу, но исправление всего существующего кода кажется болезненным, поэтому я хочу это сделать.   -  person Sudar    schedule 05.08.2012
comment
Как такой код мог работать? Например, если компилятор видит foo(0, 0);, как он узнает, следует ли передавать нули как целые числа, указатели, числа с плавающей запятой или что-то еще? Черт возьми, объявление может быть даже void foo(int, int, int = 0);, и компилятор должен вызвать foo с тремя параметрами. Как он мог сгенерировать правильный код?   -  person David Schwartz    schedule 05.08.2012


Ответы (2)


Вы не можете отключить эту ошибку при компиляции кода C++ - это фатальная ошибка, а не предупреждение.

Вы можете (но не должны) обойтись без этого для кода C (с -Wno-implicit-function-declaration), но это не может работать для C++.

cc1plus: warning: command line option "-Wno-implicit-function-declaration" 
                  is valid for C/ObjC but not for C++
person Mat    schedule 05.08.2012
comment
Спасибо за подтверждение того, что это невозможно в C++. Я только что обнаружил, что Arduino IDE автоматически добавляет эти прототипы функций (github.com/arduino/Arduino/blob/master/app/src/processing/app/). Думаю, мне следует абстрагировать этот код и добавить его в мой Makefile. - person Sudar; 06.08.2012

Ссылаться на; http://arduino.cc/en/Main/FAQ#.UyUa8vmSz99

Цитировать

На самом деле вы уже есть; язык Arduino — это просто набор функций C/C++, которые можно вызывать из вашего кода. Ваш эскиз претерпевает незначительные изменения (например, автоматическое создание прототипов функций), а затем передается непосредственно компилятору C/C++ (avr-g++)

больше информации; http://arduino.cc/en/Hacking/BuildProcess#.UyUa6vmSz98

Windows arduino IDE предварительно обработает прототипы объявлений функций, прежде чем передать их компилятору.

вам нужно будет встроить эту предварительную обработку в ваш проект makefile arduino, если вы хотите воспроизвести среду IDE arduino.

person 2114L3    schedule 16.03.2014
comment
Да, я как-то понял это после того, как опубликовал этот вопрос и добавил это как ограничение в свой make-файл. - person Sudar; 16.03.2014