# [C++]Pointer bei Header-Dateien



## DeChecka (4. August 2005)

Wenn ich in einem Projekt in der main.cpp Pointer auf bestimmte Variablen verwende, müsste ich diese doch auch im Sourcecode von anderen cpp-Dateien dieses Projekts verwenden können... oder nicht?
Zumindest müsste es aber umgekehrt gehen, oder? Also in einer cpp-Datei, die zu einer Header gehört, Pointer verwenden und diese dann nach Einbindung der bestimmten Header auch in der main.cpp verwenden...

Allerdings  das bei mir leider net...  

An was kann das liegen?

MfG
      DeChecka


----------



## Tobias K. (4. August 2005)

moin


Das geht auch bei mir nicht  

Du könntest die Pointer global initialisieren, aber das ist auch nicht so das wahre...
Auf Pointer die in anderen Funktionen sind, bekommst du keinen Zugriff.

Was hast du denn überhaupt vor?


mfg
umbrasaxum


----------



## MFC openGL (4. August 2005)

Könntest static Variablen nutzen, und direkt den Wert von der Main in die Varialbe deiner Klasse schreiben, wenn du mit Klassen programmierst.

Gruss

MFC OpenGL


----------



## DeChecka (5. August 2005)

@MFC OpenGL: Hmm, mit static-Variablen kenn ich mich nicht aus...

@Tobias K.: Ich will nur Variablen aus Sourcecode einer Header in anderen Sourcecodes des Projekts verwenden... Und eben zur Abwechslung mal das Deklarieren mit "extern" usw... umgehen...  

Geht das also so gar nicht mit Pointern?
Weil das hat mir irgendjemand mal gesagt, dass das möglich wäre...

MfG
      DeChecka


----------



## deepthroat (6. August 2005)

Hi.

Also Pointer sind auch nur Variablen. Vielleicht wäre ein Beispiel nicht schlecht, damit man besser weiß was du meinst (hab da so grad meine Schwierigkeiten).


----------



## Matthias Reitinger (7. August 2005)

Hm, also folgendes funktioniert bei mir einwandfrei (ist jetzt zwar C, aber sollte egal sein):

_header.h_

```
#ifndef _HEADER_H_
#define _HEADER_H_

int *pInt;

#endif //_HEADER_H_
```
foobar.c

```
#include "header.h"

void foobar()
{
	*pInt = 1234;	
}
```
main.c

```
#include <stdlib.h>
#include <stdio.h>
#include "header.h"

void foobar();

int main(int argc, char *argv[])
{
	pInt = (int *)malloc(sizeof(int));
	
	foobar();
	printf("%d", *pInt);
	
	free(pInt);
	
	return 0;
}
```

Gibt wie erwartet „1234“ aus.

Oder meintest du etwas anderes?


----------



## deepthroat (8. August 2005)

Matthias Reitinger hat gesagt.:
			
		

> Hm, also folgendes funktioniert bei mir einwandfrei (ist jetzt zwar C, aber sollte egal sein):


Nein, das ist nicht egal. Weil es nämlich in C++ illegal ist eine Variable mehrfach zu definieren. 

In ANSI C ist das OK solange die Variablen vom gleichen Typ sind, in unterschiedlichen Modulen definiert werden und höchstens eine Variable initialisiert ist. Beim Linken werden die Symbole aus den unterschiedlichen Modulen zu einer Entität zusammengeführt.

Beim GCC kann man dies allerdings auch mit dem "-fno-common" Schalter verhindern und bekommt dann den gleichen Linker-Fehler wie mit C++.


----------



## Tobias K. (8. August 2005)

moin


Das Problem löst er doch durch

```
#ifndef _HEADER_H_
#define _HEADER_H_

........

#endif //_HEADER_H_
```
?!


mfg
umbrasaxum


----------



## deepthroat (8. August 2005)

Nein, denn die Header Datei wird jeweils in der Datei foobar.c als auch in main.c eingebunden. Da die beiden Dateien getrennt voneinander kompiliert werden befinden sich in den daraus resultierenden Objekt-Dateien 2 Definitionen (/edit: also insgesamt 2, in jeder Datei eine) der Variable pInt.


----------



## Tobias K. (8. August 2005)

moin


Ach, darauf wolltest du hinaus.
Aber ja du hast recht, ich weiss nicht ob das in C geht, aber in C++(bzw. mit nem C++ Kompiler) gehts nicht.


mfg
umbrasaxum


----------



## jokey2 (8. August 2005)

Wenn Du eine Variable aus einem anderen Modul (Object) in einem anderen Modul verwenden willst, wirdt Du um das 'extern' nicht herumkommen.


----------



## Matthias Reitinger (8. August 2005)

deepthroat hat gesagt.:
			
		

> Nein, das ist nicht egal. Weil es nämlich in C++ illegal ist eine Variable mehrfach zu definieren.
> 
> In ANSI C ist das OK solange die Variablen vom gleichen Typ sind, in unterschiedlichen Modulen definiert werden und höchstens eine Variable initialisiert ist. Beim Linken werden die Symbole aus den unterschiedlichen Modulen zu einer Entität zusammengeführt.


Ok, stimmt, mein Fehler  Dann führt wohl kein Weg an extern vorbei.


----------



## DeChecka (9. August 2005)

Ok, danke euch allen, dann muss ich das wohl leider so machen!  

MfG
      DeChecka


----------

