2016-05-27 20 views
6

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.

+0

@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

+0

Ich habe versucht, Ausdruck in die UMBA_STATIC_ASSERT in(); das hat nicht geholfen. Und warum sollte es nur mit -Wall erscheinen? – Amomum

+0

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

Antwort

3

Überprüfen Sie, ob der Fehler weiterhin auftritt, wenn der Compiler über die Befehlszeile aufgerufen wird. Einige IDEs können die Ausgabe des Compilers korrekt analysieren und Warnungen für Fehler verwechseln.

0

Der Grund für den Fehler ist ziemlich einfach:

./src/Global_Macros/global_macros.h(99): warning: typedef 'umba_static_assertion_at_line_131' locally defined but not used [-Wunused-local-typedefs]

Ihre klassische C-Stil statische assert Makro funktioniert durch eine typedef machen, die schlecht definiert wird, wenn die Assertion fehlschlägt, oder einfach nur ungenutzt, wenn die Assertion passiert . -Wall enthält jedoch -Wunused-local-typedefs, die eine Warnung generiert, wenn Sie einen typedef erstellen, aber nicht verwenden. Ich vermute, Sie haben auch die Option aktiviert, Warnungen als Fehler zu behandeln.

+0

Sie haben teilweise Recht. Der Grund dafür scheint zu sein, dass eine mehrzeilige Warnmeldung von meiner IDE nicht richtig analysiert wird. Das Kompilieren von der Befehlszeile mit der gleichen Compileroption erzeugt denselben Test, nur "error: note" ist einfach "note:". Es gibt keine Option, Warnungen als Fehler zu behandeln, da andere Warnungen keine Fehler verursachen. – Amomum