Verständnisproblem mit namespace
-
Hallo liebe Community
hoffe ich bin hier im richtigen Forum. Weiss das leider nicht so genau! So nu zu meinem Problem. Ich würde gerne eine Header Datei erstellen nach der Anleitung von MSDN, hier mal der link -> http://msdn.microsoft.com/de-de/library/ms235636(v=VS.80).aspx . Der Zweck ist der das ich gerne bestimmte Funktionen aus Projekt 1 auch in PRojekt 2 nutzen möchte. Deshalb hab ich mir gedacht ich bastel mir eine DLL. Anbei mal mein Code:
#ifndef __MODBUS_H #define __MODBUS_H #define DllExport __declspec(dllexport) namespace ModbusFuncs{ class crc{ public: DllExport void __cdecl usMBCRC16(); }; } #endifNun bekomme ich einige Fehlermeldungen die ich nicht verstehe:
unter anderem:
-error C2061: Syntaxfehler: Bezeichner 'ModbusFuncs'
-error C2449: '{' auf Dateiebene gefunden - fehlt der Funktionskopf?Habe das nach der Beispiel von MSDN gemacht komme da aber irgendwie auf keinen grünen Zeig :(. Könnte sich das einmal jemand ansehen. Wäre für jeden Tipp echt dankbar!
mfg
/edit pumuckl: cpp-Tags ergänzt. Bitte künftig selber machen

-
Wie sieht denn die Quellcodedatei aus, die diesen Header einbindet?
-
Hi
hier mal die Datei:
// TestFuncDll.cpp
// compile with: /EHsc /link freemodbus.lib#include<windows.h>
#include<iostream>#include "modbus.h"
using namespace std;
int main(){
printf("Test\n");
return 0;
}
-
Denke daran auch in der .cpp Datei den namespace anzugeben:
// Header: #ifdef MYPROJECT_EXPORTS #define MY_DLL_EXPORT __declspec(dllexport) #else #define MY_DLL_EXPORT __declspec(dllimport) #endif namespace foo { class MY_DLL_EXPORT bar { public: void hello(); }; } // Source Datei: #include "foo.h" //Entweder: void foo::bar::hello() { } // oder: namespace foo { void bar::hello() {} }HTH
-
Markus82 schrieb:
hier mal die Datei:
Kann ich nicht reproduzieren.
Kannst du mal zum Test die Includedirektive durch den Inhalt von modbus.h ersetzen?
-
So da bin ich wieder. Hatte leider einpaar Probleme mit meiner Internetverbindung

@MFK
Kannst du mir erklären was ich da genau machen muss um die Includedirektive durch den Inhalt von modbus.h zu ersetzen? Bin noch relativ am Anfang meiner Programmierlaufbahn :D.@Scorcher24
Danke dir für dein Code Beispiel. Werde das gleich mal ausprobieren :). Ich glaube das wird eine lange Nacht
Kann ich den einfach den Namen foo inkludieren? Ich dachte das gut nur wenn man bei der .h Datei am Anfang #ifndef __DATEI_H, #define __DATEI_H und am Ende #endif stehen hat? Bin ein bischen verwirrt
-
Markus82 schrieb:
Kannst du mir erklären was ich da genau machen muss um die Includedirektive durch den Inhalt von modbus.h zu ersetzen?
Du ersetzt die Zeile, in der #include "modbus.h" steht, durch das, was in modbus.h steht.
-
So hier mal der Quellcode:
->modbus.h
//modbus.h #ifndef __MODBUS_H_ #define __MODBUS_H_ #if defined(_MSC_VER) #include<windows.h> #define DLL extern "C" __declspec(dllexport) #else #define DLL #endif DLL void usMBCRC16(); #endif->mbcrc.cpp
(Dies ist die Datei deren Funktion ich später aus der DLL heraus nutzen möchte)#include "port.h" static const UCHAR aucCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 }; static const UCHAR aucCRCLo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 }; USHORT usMBCRC16( UCHAR * pucFrame, USHORT usLen ) { UCHAR ucCRCHi = 0xFF; UCHAR ucCRCLo = 0xFF; int iIndex; while( usLen-- ) { iIndex = ucCRCLo ^ *( pucFrame++ ); ucCRCLo = ( UCHAR )( ucCRCHi ^ aucCRCHi[iIndex] ); ucCRCHi = aucCRCLo[iIndex]; } return ( USHORT )( ucCRCHi << 8 | ucCRCLo ); }Bin ziemlich am verzweifeln :(. Habe mal versucht die h. Datei anders zu schreiben.
@Scorcher24
Deine Version ist aber mit Hilfe von C++ ?Trotz intensivem Lesen und Forenbeiträgen durchsuchen hab ich immer noch Schwierigkeiten :/. Danke euch aber für eure tolle Hilfe
!
-
Markus82 schrieb:
@Scorcher24
Deine Version ist aber mit Hilfe von C++ ?Sie ist genauso viel beziehungsweise wenig C++ wie deine. DLL,Lib,so... sind allesamt nicht im Ansi C++ Standard definiert. Was möglich ist und was nicht ist daher abhängig vom Betriebssystem und Compiler.
-
Markus82 schrieb:
So hier mal der Quellcode:
Der ist ja nun komplett anders. Ein Problem mit namespace kann's nicht mehr geben, weil namespace nicht mehr auftaucht. Der Header wird auch gar nicht mehr eingebunden.
Was ist also das Problem mit diesem Code?
-
@MFK:
So hab im letzten Post versucht das so zu machen wies bei Wiki steht :/. Aber dem Code kriege ich jetzt die Fehlermeldung Syntaxfehler 'Zeichenfolge' . Woraufhin ich gegoogelt habe und herausfand das die Dateien cpp sein müssen. Nun verschwindet der Fehler aber ich bekomme dann mehrere LInker fehler über nicht aufgelöste externe Symbole ??...
Also mein Problem ist das ich nicht weis was alles C ist und was schon C++ und was man bei den entsprechenden Implementationen beachten muss
bzw. das anscheinen durcheinander Werfe bzw. Schwierigkeiten hab das auseinander zu halten.
Weshalb der letzte Code den ich gepostet habe anders ist. Vielleicht könntest du mir einpaar grundsätzliche Tipps geben auf was ich beim implementieren achten muss ?
-
-
@MFK
Danke dir für den Link und für deine / eure Hilfe. Den Link hab ich durchgearbeitet und auch soweit gut verstanden. Wie ist das den wenn ich nun sagen wir mal 10 verschiedene cpp und h Dateien hab. Wie muss ich da vorgehen um die zu einer DLL zumachen?
Was genau haben den die Kommentarzeilen über dem Code zu bedeuten, also z.B.// MathFuncsDll.cpp // compile with: /EHsc /LDHab das versucht auf der MS Seite nachzuvollziehe werde aber nicht so wirklich schlau draus :/.