<cmath> in C++ Klasse ->Syntax Error
-
Hallo,
in einem MFC-Dialog-Projekt sind auch reine C++ Klassen enthalten. Wenn in diesen .h-Dateien <cmath> includiert wird, gibts 100+ Fehler.
Steht dieses #include (im selben Projekt) dagegen in einer MFC Klasse (mit CWnd als Basisklasse, ect.) gibts keine Probleme.
Gibts da etwas was man zusätzlich tun muß damit cmath in einer reinen C++ Klasse korrekt nutzbar ist?
Danke.
-
Nein, der Fehler liegt woanders. cmath definiert zwar ein paar globale Makros, damit sollte standardkonformer(!) Code aber zurecht kommen. Weiterhin werden bei manchen Implementierungen noch weitere Makros definiert (z.B. M_PI im GCC oder, wichtiger Nachtrag im Beitrag unter diesem, MIN und MAX in MSVC), die nicht im Standard stehen, dies sollte sich im Notfall jedoch abschalten lassen. Es klingt jedoch eher unwahrscheinlich, dass dies dein Fehler ist. Im großen und ganzen ist cmath ein Header wie jeder andere auch.
Höchstwahrscheinlich ist der Code an sich fehlerhaft.
edit: Mit "in der Klasse" meinst du aber doch wohl nicht
class Foo { #include <cmath> // ... };oder? Das wäre falsch, weil Includes der Standardheader im Filescope stehen müssen.
-
MFC-Coder schrieb:
in einem MFC-Dialog-Projekt sind auch reine C++ Klassen enthalten. Wenn in diesen .h-Dateien <cmath> includiert wird, gibts 100+ Fehler.
möglich, dass dies ein Problem mit den MAX- und MIN-Makros in der MFC/Windows ist. Setze in Deinem MFC-Projekt im Header
stdafx.hvor(!) dem ersten Include ein#define NOMINMAXund versuche es nochmal. (http://support.microsoft.com/kb/143208/de)
-
SeppJ schrieb:
edit: Mit "in der Klasse" meinst du aber doch wohl nicht
class Foo { #include <cmath> // ... };oder? Das wäre falsch, weil Includes der Standardheader im Filescope stehen müssen.
Nein ist nicht so.
MyClass.h:
#pragma once #include <cmath> class MyClass { . . . }So kommen die 100+ Fehler.
Fehlerfrei gehts dagegen bei:
(obiges #include in MyClass.h weg)#pragma once #include <cmath> // CMyAppDlg-Dialogfeld class CMyAppDlg: public CDialog { // Konstruktion public: CMyAppDlg(CWnd* pParent = NULL); // Standardkonstruktor
-
Werner_logoff schrieb:
MFC-Coder schrieb:
in einem MFC-Dialog-Projekt sind auch reine C++ Klassen enthalten. Wenn in diesen .h-Dateien <cmath> includiert wird, gibts 100+ Fehler.
möglich, dass dies ein Problem mit den MAX- und MIN-Makros in der MFC/Windows ist. Setze in Deinem MFC-Projekt im Header
stdafx.hvor(!) dem ersten Include ein#define NOMINMAXund versuche es nochmal. (http://support.microsoft.com/kb/143208/de)
Also so:
// stdafx.h : Includedatei für Standardsystem-Includedateien // oder häufig verwendete, projektspezifische Includedateien, // die nur selten geändert werden. #pragma once #ifndef _SECURE_ATL #define _SECURE_ATL 1 #endif #ifndef VC_EXTRALEAN #define VC_EXTRALEAN // Selten verwendete Teile der Windows-Header ausschließen #endif #define NOMINMAX #include "targetver.h" #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // einige CString-Konstruktoren sind explizit // Deaktiviert das Ausblenden einiger häufiger und oft ignorierter Warnungen durch MFC #define _AFX_ALL_WARNINGS #include <afxwin.h> // MFC-Kern- und -Standardkomponenten #include <afxext.h> // MFC-Erweiterungen . . .Versagt leider auch.
-
Zeige die ersten 10 Fehler.
-
Dann poste uns doch mal den allerersten Compiler-Error nebst des zugehörige Stück Source-Code, auf das sich der Fehler bezieht (mit Angabe der Datei und Zeilennummer).
Welche Visual Studio Version verwendest Du?
-
Hi,
Fehler:
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(107) : error C2143: Syntaxfehler: Es fehlt ')' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(107) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(107) : error C2059: Syntaxfehler: ')'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(108) : error C2143: Syntaxfehler: Es fehlt ')' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(108) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(108) : error C2059: Syntaxfehler: ')'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(109) : error C2143: Syntaxfehler: Es fehlt ')' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(109) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(109) : error C2059: Syntaxfehler: ')'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(110) : error C2143: Syntaxfehler: Es fehlt ')' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(110) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(110) : error C2059: Syntaxfehler: ')'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(113) : error C2143: Syntaxfehler: Es fehlt ')' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(113) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(113) : error C2059: Syntaxfehler: ')'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(116) : error C2143: Syntaxfehler: Es fehlt ')' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(116) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante'
1>d:\programme\microsoft visual studio 9.0\vc\include\math.h(116) : error C2059: Syntaxfehler: ')'Angeblicher Fehlercode:
/* Function prototypes */ #if !defined(__assembler) /* Protect from assembler */ #ifndef _CRT_ABS_DEFINED #define _CRT_ABS_DEFINED int __cdecl abs(_In_ int _X); long __cdecl labs(_In_ long _X); #endif double __cdecl acos(_In_ double _X); double __cdecl asin(_In_ double _X); double __cdecl atan(_In_ double _X); double __cdecl atan2(_In_ double _Y, _In_ double _X); #ifndef _SIGN_DEFINED _Check_return_ _CRTIMP double __cdecl _copysign (_In_ double _Number, _In_ double _Sign); _Check_return_ _CRTIMP double __cdecl _chgsign (_In_ double _X); #defineZeile 107 im Fehlerlog entspricht hier Zeile 10.
IDE: MSVS 2008 Standard Edition.
-
MFC-Coder schrieb:
MyClass.h:
#pragma once #include <cmath> class MyClass { . . . }Am Ende deiner .h Datei fehlt das Semikolon hinter der schließenden Klammer.
-
DocShoe schrieb:
Am Ende deiner .h Datei fehlt das Semikolon hinter der schließenden Klammer.
Im Prg exisitiert sie. Außerdem schrieb ich:
in einem MFC-Dialog-Projekt sind auch reine C++ Klassen enthalten. Wenn in diesen .h-Dateien <cmath> includiert wird, gibts 100+ Fehler.
Steht dieses #include (im selben Projekt) dagegen in einer MFC Klasse (mit CWnd als Basisklasse, ect.) gibts keine Probleme.

-
So nun gehts.
Nachdem nun das include in der *.cpp Datei steht und nicht in der *h Datei gibts kein Gemecker mehr.