Forum: Compiler & IDEs Header-File automatisch generieren


von Uwe (Gast)


Lesenswert?

Hallo,

ich schreibe oft wiederverwendbare Programmmodule und verwende 
selbstverständlich Header-Files für die Definitionen dafür.

Allerdings ist es sehr mühsehlig die .h immer selbst zu schreiben.

Kennt jemand ein Tool das aus dem .c-File mir die 
Funktions-Deklarationen automatisch auslesen und das .h-File erstellen 
kann?

Gruß

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Allerdings ist es sehr mühsehlig die .h immer selbst zu schreiben.

So?

Hmm, in einem ordentlichen Softwaredesign wäre das Headerfile
eigentlich zuerst da, da es das Interface eines Moduls nach außen
beschreibt.  Erst wenn das feststeht, sollte man mit der
Implementierung beginnen.  Alle Hilfsfunktionen, die ,,auf dem Weg''
entstehen, werden dann von vornherein gleich "static" deklariert,
damit sind sie nur modulintern sichtbar und müssen folglich auch nicht
ins Headerfile.

Ansonsten ist die von dir gewünschte Aufgabe so einfach nicht, da man
(zumindest wenn man es komplett formatfrei erledigen können möchte) ja
praktisch einen Teil des C-Parsers dafür implementieren muss.

GCC hat ein Feature, mit dem er beim Compilieren alle
Funktionsprototypen in eine separate Datei ablegen kann, die man ihm
mit -aux-info <dateiname> angibt.  Das müsste dir dafür weiter helfen.

von Winne (Gast)


Lesenswert?

Ich mache das anders:

jede neu Funktion die  ich editire stelle ich allen anderen 
zuvorerstellten voran. Unnmittelbar nach Erstellen der 
Funktionsdefinition  kopiere ich diese, füge sie oberhalb einer 
Trennzeile als letzte ein und ändere sie in eine Funktionsdecleration 
um.

So erhalte ich ohne großen auf Aufwand eine Liste der im Programm 
definerten Funktionen und stelle sicher das alle Funktionen vor ihrem 
Erstenaufruf deklariert sind. Gelegentlich verwende ich selbige 
Declerationsliste wenn ich ein Modul für eine lib schreibe gleichzeitig 
zum erstellen des Haederfiles.

von Winne (Gast)


Lesenswert?

z.B.so



[c]
/*---------------------------------------------------------------------- 
----------------------------

  Name         :  LCD8bit.lib

  Description  :  Libery file for 8Bit LCD driver.
                  für Atmel 128 µC's
  Author       :  Winfried Jaeckel (deviltronic)

  and  this    :  Daten und Steuerport_Bits können
                  relativ freigewählt, müssen dann aber in den
                  "General purpose constants" angepaßt werden.

------------------------------------------------------------------------ 
--------------------------*/

#ifndef LCD8bit
#define LCD8bit
#include <delay.h>

/*---------------------------------------------------------------------- 
----------------------------
                                  General purpose constants
------------------------------------------------------------------------ 
--------------------------*/
#ifndef NULL
#define NULL                       0
#endif

#define FALSE                      0
#define TRUE                       1

#define LCD_X_RES                  16
#define LCD_Y_RES                  2

// Datenport

#define LCD_Dataport               PORTA    // PortA
#define LCD_Dataport_RR            DDRA
// Steuerport
#define LCD_Steuerport             PORTC    // PORTC
#define LCD_Steuerport_RR          DDRC

#define LCD_ON_PIN                 0x01     //  PC0
#define LCD_RS_PIN                 0x02     //  PC1
#define LCD_RW_PIN                 0x04     //  PC2
#define LCD_E_PIN                  0x08     //  PC3
// LCDPWM PORT

#define LCD_PWM_PORT               PortB    // Portb
#define LCD_PWM_PORT_RR            PortB    // Portb



/*---------------------------------------------------------------------- 
----------------------------
                                 Public function prototypes
------------------------------------------------------------------------ 
--------------------------*/
/*
static void LCD_Delay               (void);
static void LCD_SDelay              (void);

void LCD_Open                   (void);
void LCD_Close                  (void);
void LCD_Strobe                 (void);
void LCD_Command                (void);
void LCD_Data                   (void);

void LCD_Clear                  (void);
void LCD_Home                   (void);
void LCD_Uhr_Home               (void);
void LCD_S_L_Home               (void);
void LCD_2_L_Home               (void);
void LCD_3_L_Home               (void);
void LCD_4_L_Home               (void);
void LCD_Mode                   (void);
void LCD_D_C_Control            (void);
void LCD_D_C_Shift              (void);
void LCD_Funktion_Set           (void);
void LCD_Set_CDRAM_ADDR         (unsigned char CDADDR);
void LCD_Set_DDRAM_ADDR         (unsigned char DDADDR);
void LCD_Read_BUSYFlag_ADC      (void); // inaktiv
void LCD_Write_Data_to_RAM      (unsigned char DB);
void LCD_ReadD_Data_from_RAM    (void);// inaktiv

void LCD_Init                   (void);
void LCD_Write_Str              (char []);
void LCD_Write_Strf             (flash char str [] );
void LCD_Write_Stre             (eeprom char str [] );
void LCD_Cursor_On              (void);
void LCD_Cursor_Off             (void);
void LCD_Cursor_Blink           (void);

Characters          01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
First line      (H) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 
80-8F
Second line     (H) 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 
C0-FF
Third line      (H) 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 
90-9F
Fourth line     (H) 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 
D0-DF

 */

//-------------------------------------------------
static void LCD_Delay ( void )
{
    delay_ms(30);

}
//-------------------------------------------------
static void LCD_SDelay ( void )
{
    delay_ms(1);

}
//-------------------------------------------------
//------------------------------------------------------

void LCD_Open(void)

{
   //LCD_Steuerport = 0xFA;            //steuerbits high
   //LCD_Steuerport_RR = 0x0F;        //steurport ein
   //LCD_Dataport = 0x00;             // Port Löschen
   //LCD_Dataport_RR = 0xFF;          // Dataport zur Ausgabe freigeben

}


//------------------------------------------------------
void LCD_Close(void)

{
   //LCD_Dataport_RR = 0xFF;          // Dataport zur Ausgabe freigeben
   //LCD_Dataport = 0x00;             // Port Löschen
   //LCD_Steuerport = 0xFA;            //steuerbits high
   //LCD_Steuerport_RR = 0x0F;        //steurport ein

}

//----------------------------------------

   void LCD_on (void)
{
    LCD_Steuerport =0xFE // &= ~LCD_ON_PIN
    ;
    delay_ms(1000);
    LCD_Steuerport =0xFA; // &= ~LCD_RS

}
//----------------------------------------

   void LCD_off (void)
{

    LCD_Steuerport =0xFF //|= LCD_ON_PIN
    ;
    delay_ms(1000);

}

//----------------------------------------

void LCD_Strobe(void)
{
    LCD_Steuerport &= ~LCD_E_PIN;
    LCD_SDelay();
    LCD_Steuerport |= LCD_E_PIN;
    LCD_SDelay();
}
//----------------------------------------

void LCD_Command(void)
{
    LCD_Steuerport &= ~LCD_RS_PIN;
    LCD_SDelay();
}
//----------------------------------------

void LCD_Data(void)
{
    LCD_Steuerport |= LCD_RS_PIN;
    LCD_SDelay();
}


//-------------------------------------------------
void LCD_Clear ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x01;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
}
//-------------------------------------------------
void LCD_Home ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x02;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}
//-------------------------------------------------
void LCD_Mode ( void )
{

    LCD_Delay();
    LCD_Delay();

    LCD_Delay();
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x06;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
    LCD_Delay();
    LCD_Delay();
}
//-------------------------------------------------
void LCD_D_C_Control ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x0C;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}

//-------------------------------------------------
void LCD_Cursor_On ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x0E;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}
//--------------------------------------------------
void LCD_Cursor_Off ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x0C;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}
//--------------------------------------------------
void LCD_Cursor_Blink ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x0F;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}
//--------------------------------------------------
void LCD_D_C_Shift ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x14;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
}
//-------------------------------------------------
void LCD_Funktion_Set ( void )
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = 0x38;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_Delay();
}
//-------------------------------------------------

void LCD_Write_Data_to_RAM (unsigned char DB )
{
    LCD_Open();
    LCD_Data();

    LCD_Dataport = DB;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
}
//-------------------------------------------------

void LCD_Init (void)
{
LCD_Delay();
LCD_Funktion_Set();
LCD_D_C_Control();
LCD_Mode();
LCD_Clear();
LCD_Home();
}

//-------------------------------------------------
void LCD_Set_DDRAM_ADDR         (unsigned char DDADDR)
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = DDADDR;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_SDelay();
}
//-------------------------------------------------
void LCD_Uhr_Home               (void)
{
LCD_Set_DDRAM_ADDR(0x88);LCD_Delay();
}

//-------------------------------------------------
void LCD_S_L_Home               (void)
{
LCD_Set_DDRAM_ADDR(0xC0);LCD_Delay();
}
//-------------------------------------------------
void LCD_2_L_Home               (void)
{
LCD_Set_DDRAM_ADDR(0xC0);LCD_Delay();
}
//-------------------------------------------------
void LCD_3_L_Home               (void)
{
LCD_Set_DDRAM_ADDR(0x90);LCD_Delay();
}
//-------------------------------------------------

void LCD_4_L_Home               (void)
{
LCD_Set_DDRAM_ADDR(0xD0);LCD_Delay();
}
//-------------------------------------------------
void LCD_Set_CDRAM_ADDR         (unsigned char CDADDR)
{
    LCD_Open();
    LCD_Command();

    LCD_Dataport = CDADDR;
    LCD_Strobe();

    LCD_Data();
    LCD_Close();
    LCD_SDelay();
    }

//-------------------------------------------------
void LCD_Write_Str (char str [] )
{
    while ( *str )
        {
        LCD_Write_Data_to_RAM(*str++);
        }

}
//-------------------------------------------------
void LCD_Write_Strf (flash char str [] )
{
    while ( *str )
        {
        LCD_Write_Data_to_RAM(*str++);
        }

}
//-------------------------------------------------
void LCD_Write_Stre (eeprom char str [] )
{
    while ( *str )
        {
        LCD_Write_Data_to_RAM(*str++);
        }

}

//-------------------------------------------------
#endif  //  LCD8bit
/*---------------------------------------------------------------------- 
----------------------------*/

[\c]

von Winne (Gast)


Lesenswert?

hoppla jetzt aber:
1
/* LCD 8Bit driver routines
2
3
*/
4
5
#ifndef _LCD8bit_INCLUDED_
6
#define _LCD8bit_INCLUDED_
7
8
9
#pragma used+
10
static void LCD_Delay               (void);
11
static void LCD_SDelay              (void);
12
13
void LCD_Open                   (void);   
14
void LCD_Close                  (void);
15
void LCD_on                     (void);
16
void LCD_off                    (void);
17
18
void LCD_Strobe                 (void);
19
void LCD_Command                (void);
20
void LCD_Data                   (void);
21
22
void LCD_Clear                  (void);
23
void LCD_Home                   (void);
24
void LCD_Uhr_Home               (void);
25
void LCD_S_L_Home               (void);
26
void LCD_2_L_Home               (void);
27
void LCD_3_L_Home               (void);
28
void LCD_4_L_Home               (void);
29
30
void LCD_Mode                   (void);
31
void LCD_D_C_Control            (void);
32
void LCD_D_C_Shift              (void);
33
void LCD_Funktion_Set           (void);
34
void LCD_Set_CDRAM_ADDR         (unsigned char CDADDR); 
35
void LCD_Set_DDRAM_ADDR         (unsigned char DDADDR);
36
//void LCD_Read_BUSYFlag_ADC      (void); // inaktiv
37
void LCD_Write_Data_to_RAM      (unsigned char DB); 
38
//void LCD_ReadD_Data_from_RAM    (void);// inaktiv
39
40
void LCD_Init                   (void);   
41
void LCD_Write_Str              (char []);
42
void LCD_Write_Strf             (flash char str [] );  
43
void LCD_Write_Stre             (eeprom char str [] );
44
void LCD_Cursor_On              (void);
45
void LCD_Cursor_Off             (void);
46
void LCD_Cursor_Blink           (void);
47
48
49
#pragma used-
50
#pragma library Lcd8bit.lib
51
52
#endif

von Winne (Gast)


Lesenswert?

sorry da ich nicht angemeldet sondern nur als Gast anwesend war kann 
ichs nicht korrigeren oder löschen. Die token sind mir missglückt aber 
worum es geht ist wohl leicht zu erkennen.
CTRL+c und CTRL+v sind deine Freunde bei der Routinearbeit sicher wäre 
ein Genrator auch eine Lösung. Am besten einer der beim erstellen einer 
*.lib gleich das zugeöhrige *.h generiert

von Dirk (Gast)


Lesenswert?

Ah ja, sehr schön...
aber ich erinnere mich noch wage daran das nach automatischer Erstellung 
des Haeders gefragt wurde.

von Uwe (Gast)


Lesenswert?

Vielen Dank.
Der Tipp von Jörg tuts erstmal. Geb ihm auch vollkommen recht in seiner 
Aussage.
Die Idee von Winne ist aber auch nicht schlecht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.