Я пытаюсь использовать компилятор gcc в Keil IDE для микроконтроллера stm32f103. Я компилирую относительно небольшой проект с небольшим количеством кода шаблона и парой чистых виртуальных классов. Никаких причудливых вещей C++11. Все идет нормально.
Когда я компилирую с -w или -pedantic, проект компилируется просто отлично. Но когда я ставлю -Wall, у меня возникает ошибка компиляции в этой части:
template <typename T, typename U>
T & round(T & value, U roundStep)
{
UMBA_ASSERT(roundStep > 0);
UMBA_STATIC_ASSERT( std::numeric_limits<T>::is_integer );
UMBA_STATIC_ASSERT( std::numeric_limits<U>::is_integer );
T temp = value / roundStep;
T remainder = value - temp*roundStep;
if(remainder < roundStep/2)
{
value = temp*roundStep;
}
else
{
value = (temp+1)*roundStep;
}
return value;
}
UMBA_STATIC_ASSERT — это типичное «статическое утверждение C»:
#define UMBA_STATIC_ASSERT_MSG(condition, msg) typedef char umba_static_assertion_##msg[(condition)?1:-1]
#define UMBA_STATIC_ASSERT3(X, L) UMBA_STATIC_ASSERT_MSG(X, at_line_##L)
#define UMBA_STATIC_ASSERT2(X, L) UMBA_STATIC_ASSERT3(X, L)
#define UMBA_STATIC_ASSERT(X) UMBA_STATIC_ASSERT2(X, __LINE__)
Самое смешное, что я даже не могу понять ошибку:
compiling common_functions.cpp...
src/Common_Functions/common_functions.h: In function 'T& common_functions::round(T&, U)':
./src/Global_Macros/global_macros.h(99): warning: typedef 'umba_static_assertion_at_line_131' locally defined but not used [-Wunused-local-typedefs]
#define UMBA_STATIC_ASSERT_MSG(condition, msg) typedef char umba_static_assertion_##msg[(condition)?1:-1]
./src/Global_Macros/global_macros.h(100): error: note: in expansion of macro 'UMBA_STATIC_ASSERT_MSG'
./src/Global_Macros/global_macros.h(101): error: note: in expansion of macro 'UMBA_STATIC_ASSERT3'
./src/Global_Macros/global_macros.h(104): error: note: in expansion of macro 'UMBA_STATIC_ASSERT2'
src/Common_Functions/common_functions.h(131): error: note: in expansion of macro 'UMBA_STATIC_ASSERT'
Это отличается от ошибки статического утверждения, которая выглядит примерно так: «ошибка: размер массива umba_static_assertion_at_line_21 отрицательный». И, насколько я понимаю, функция round даже нигде в проекте не вызывается.
Вот все опции компилятора на всякий случай; включения в папку Keil помещаются туда автоматически IDE:
-c -mcpu=cortex-m3 -mthumb -gdwarf-2 -MD -Wall -O0 -I./src -I./src/Modules_Config -I./src/CMSIS -I./src/SPL/inc -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -mcpu=cortex-m3 -IC:/Keil4.72/ARM/CMSIS/Include -IC:/Keil4.72/ARM/Inc/ST/STM32F10x -DUSE_STDPERIPH_DRIVER -DUSE_FULL_ASSERT -Wa,-alhms="./lst/*.lst" -o *.o
Я не уверен, что с этим делать.
<
и>
для препроцессора актуальна только тогда, когда также присутствуют запятые, которых здесь нет. - person Smeeheey   schedule 27.05.2016-Wall
должно вызывать добавление всех этих строк в ваш вывод, частьerror: note: ...
должна быть простоnote: ...
. Это примечание, прикрепленное к предупреждению, а не ошибка, поэтому эти примечания не должны вызывать сбой компиляции. Какая это версия GCC? Если вы уменьшите исходный код только до#define MACRO typedef char a[];
/void f() { MACRO }
, это также даст ошибку в примечании о расширении макроса? - person   schedule 27.05.2016src/main.cpp: In function 'void f()': src/main.cpp(21): warning: typedef 'a' locally defined but not used [-Wunused-local-typedefs] src/main.cpp(26): error: note: in expansion of macro 'MACRO'
- person Amomum   schedule 27.05.2016-Werror
, обрабатывающий предупреждения как ошибки.-w
запрещает все предупреждения, поэтому неудивительно, что вы не получаете это предупреждение при его использовании. (В вашей командной строке нет-Wall
- вы правильно скопировали?) - person molbdnilo   schedule 27.05.2016-Wall
включает-Wunused-local-typedefs
и, как говорится в сообщении, макрос вводит неиспользуемый локальный typedef, так что... - person molbdnilo   schedule 27.05.2016"./lst/*.lst" -o *.o
недействителен, что может вводить в заблуждение при выводе IDE. При изменении этого, чтобы указать имена файлов, компиляция завершается успешно. - person   schedule 27.05.2016