Ich versuche, GCC-Compiler in Keil IDE für Stm32f103 Mikrocontroller zu verwenden. Ich kompiliere ein relativ kleines Projekt mit ein wenig Template-Code und einigen rein virtuellen Klassen. Keine schicken C++ 11 Sachen. So weit so gut.gcc -Wall führt Compiler Fehler
Wenn ich mit -w oder -pedantic kompiliere, kompiliert Projekt einfach gut. Aber wenn ich -Wall habe ich Kompilierungsfehler in diesem Teil haben:
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 ist ein typisches "C statisch assert":
#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__)
Das lustige daran ist, dass ich nicht kann verstehen auch den Fehler:
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'
Es unterscheidet sich von statischen Behauptung Fehler, der so etwas wie ist ‚Fehler: Größe des Array‘ umba_s tatic_assertion_at_line_21 'ist negativ'. Und, soweit ich das beurteilen kann, wird die runde Funktion nirgendwo im Projekt aufgerufen.
Hier sind alle Compiler-Optionen nur für den Fall; Includes zum Keil-Ordner werden dort automatisch per IDE hingelegt:
-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
Ich bin mir nicht sicher, was ich damit machen soll.
@bolov - im Zusammenhang mit Ihrem 'Duplikat' ist das '<' and '> 'Problem für den Preprozessor nur relevant, wenn Kommas vorhanden sind, die sie nicht hier sind. – Smeeheey
Ich habe versucht, Ausdruck in die UMBA_STATIC_ASSERT in(); das hat nicht geholfen. Und warum sollte es nur mit -Wall erscheinen? – Amomum
Hier stimmt etwas nicht. Während "-Wall" dazu führen sollte, dass alle diese Zeilen in Ihrer Ausgabe hinzugefügt werden, sollte der 'error: note: ...' -Teil nur 'note: ...' sein. Es handelt sich um eine Notiz, die an die Warnung angehängt ist und nicht an einen Fehler. Daher sollten diese Hinweise nicht dazu führen, dass die Kompilierung fehlschlägt. Welche Version von GCC ist das? Wenn Sie den Quellcode auf '#define MACRO typedef char a [];'/'void f() {MACRO}' reduzieren, gibt dies auch einen Fehler in der Notiz über die Makroerweiterung? – hvd