Forum: Compiler & IDEs Header Dateien Groß/Kleinschreibung


von jeromert (Gast)


Lesenswert?

Hallo,

ich muss ein C Projekt, welches eigentlich auf Windows entwickelt wurde, 
zu Linux portieren, der benutzte Compiler ist GCC.
Dort kann der Compiler aber die Dateien nicht finden, da die Header 
Dateien öfters auf folgender Weise eingefügt wurden:

1. #include "Abc.h", der richtige Dateiname ist aber klein geschrieben ( 
abc.h )
2. #include "..\src\abc.h", der umgekehrte Schrägstrich wird aber in 
Linux nicht unterstützt.

Ich kann(sollte) den Sourcecode so wenig wie möglich ändern, da das 
Projekt auf Windows immer noch weiterentwickelt wird, und ich dann bei 
jeder neuen Version alles nochmal ändern müsste.

Weiss vielleicht jemand von einer Compiler Option o.ä., mit der ich 
dieses Problem umgehen kann?

Sorry wenn es zu diesen Thema schon einen Thread gibt, habe lange danach 
gegoogelt.

Jerome

von Christian J. (Gast)


Lesenswert?

Du must die include verzeichnisse, di emit den Headern als parameter an 
gcc übergeben. für Linux: -I./include für Windows:-I.\include. Das 
machst du für alle verzeichnisse, in denen .h Dateien liegen.

du kannst gcc auch merere übergeben.
1
gcc -I.\include -I.\include2 -I.\include3 ...

Ich hoffe du verstehst wie ich das meine.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Da scheint mir ein automatischer Sourcecodekonverter, der alle eine 
#include-Anweisung enthaltenden Zeilen behandelt, ein gangbarer Weg.

Das sollte mit per regex ausdrückbaren Regeln mit einem Werkzeug wie 
sed machbar sein:

* Behandle nur Zeilen, die mit #include beginnen
* Ersetze in diesen jedes \ durch /
* Wandle in diesen alles in Kleinbuchstaben

Diesen Konverter-Mechanismus kannst Du per makefile vor dem eigentlichen 
Compilerdurchlauf aufrufen.

von Daniel H. (dl7vkj)


Lesenswert?

1.: C ist Case sensitiv.
2.: Das Verhalten ist laut C Standard undefiniert, wenn  im Header Namen 
"\" auftaucht. Gleiches gilt für "//", "'" und "/*".

Du solltest die anderen Programmierer also überreden, sich an den C 
Standard zu halten!

von g457 (Gast)


Lesenswert?

..sinnvoller als das jedes Mal aufs Neue wieder zu erledigen wäre es, 
'das Original' (einmalig) zu korrigieren. Frag doch mal, ob Du das für 
sie übernehmen darfst, mit etwas Geschick könnte sich das auf einige 
Zeilen Bash und ein paar Aufrufe selbiger beschränken. Anschließend das 
Projekt wieder 'zurückgeben'..

HTH

von Link zu (Gast)


Lesenswert?

Ohm, was spricht gegen [1] "Tabelle 12.4   Konstanten für bestimmte 
Betriebssysteme"?

[1] http://www.win-tux.de/c_012_002.htm#RxxobKap012002040027FC1F02718C

von Klaus W. (mfgkw)


Lesenswert?

Die sinnigste Lösung wäre m.E. ebenfalls, die Namen in
einer irgendwie sinnvollen Weise zu schreiben und die
Quelltexte einmalig entsprechend anzupassen.

Falls das wirklich nicht geht, fallen mir noch folgende Varianten
ein:

1. Den Headerdateien ihre Namen zu lassen, und für alle
   vorkommenden anderen Schreibweisen symbolische Links
   auf die Dateien anlegen.
   Beispiel:
   Es gebe die Datei abc.h und #includes für abc.h, Abc.h und
   ABC.h. Dann macht man einfach symLinks Abc.h und ABC.h, die
   auf die Datei abc.h zeigen.
   Das geht, indem man in das passende Verzeichnis geht und
   dort eingibt:
1
     ln -s abc.h Abc.h ABC.h

2. Je nach Dateisystem (ich glaube für die FAT-Varianten und
   für NTFS) gibt es eine Option beim Mounten, aufgrund der
   Groß-/Kleinschreibung ignoriert wird.
   D.h. man könnte zumindest den Dateibaum, in dem die
   Headerdateien liegen, damit mounten.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 1.: C ist Case sensitiv.

C ja, aber C schreibt nicht vor, wie das Dateisystem mit Dateinamen 
umzugehen hat; C weiß überhaupt nicht, was Dateien oder Dateinamen sind.

Was den zweiten Punkt des Pfadtrenners angeht, so ist es eine reichlich 
autistische Sichtweise, ein verbreitetes Betriebssystem hartnäckig zu 
ignorieren, auch wenn das Betriebssystem noch so unbeliebt sein mag. Es 
existiert, und es wird in absehbarer Zeit auch keinen Abgang machen.

Sinnvolle Präprozessoren sind in der Lage, einfach mit beiden 
Schreibweisen umzugehen, ohne Rücksicht auf ihr Wirtsbetriebssystem 
nehmen zu müssen.

Und wenn die Unterscheidung von Groß- und Kleinschreibung in Dateinamen 
auch noch so schick sein mag, hat es wirklich einen Sinn, daß blafusel 
und BLAFUSEL zwei unterschiedliche Dateien sein können? Gibt es eine 
wirklich ernstzunehmende Anwendung davon (abgesehen von der reichlich 
verkorksten Konvention, daß .C C++- und .c C-Quelltext kennzeichnen 
soll)?

Nein. Auch das scheint nur bewusst politisch gehaltene Inkompatilität zu 
anderen Systemen zu sein.

Es gibt übrigens unixoide Betriebssysteme, deren Dateisysteme 
standardmäßig nicht zwischen Groß- und Kleinschreibung unterscheiden:
1
Last login: Tue Feb  9 21:45:26 on ttys000
2
macbook:~ rufus$ pwd
3
/Users/rufus
4
macbook:~ rufus$ mkdir bla
5
macbook:~ rufus$ mkdir Bla
6
mkdir: Bla: File exists
7
macbook:~ rufus$ cd Bla
8
macbook:Bla rufus$

von Klaus W. (mfgkw)


Lesenswert?

Gibt es einen triftigen Grund, Groß-/Kleinschreibung zu ignorieren?

Rufus t. Firefly schrieb:
> Nein. Auch das scheint nur bewusst politisch gehaltene Inkompatilität zu
> anderen Systemen zu sein.

das mag sein, aber offenbar seitens Microsoft.
Unix hatte seine Variante mit der Unterscheidung schon vor FAT.

Edit: .. und ist zudem flexibler, je nach Dateisystem kann es auch
Gro-ß/Kleinschreibung ignorieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und so drehen wir uns im Kreis.

Wenn es unterschiedliche Standpunkte bei einem Problem gibt, dann gibt 
es zwei Herangehensweisen, um das Problem zu lösen:

a) man beharrt unbeweglich auf seinem Standpunkt und wirft der 
Gegenseite ihren Fehler vor

b) man trifft sich in der Mitte und sucht einen gemeinsamen Nenner

Da MS-Dateisysteme seit einigen Jahren immerhin die Groß- und 
Kleinschreibung zwar nicht unterscheiden, aber speichern, hat sich hier 
MS wenigstens ein Futzelchen bewegt.

(Genauer: Davor hatte MS gar keine Dateinamen, sondern nur recht 
nutzlose 8.3-Kürzel).

Übrigens haben vor MS auch andere Betriebssysteme keine Unterschiede in 
Groß/Kleinschreibung bei Dateinamen gekannt, das ist also keine 
"Erfindung" von MS.

> Gibt es einen triftigen Grund, Groß-/Kleinschreibung zu ignorieren?

Das beantwortet meine Frage nicht. Existiert eine Anwendung, bei der 
gleichzeitig Dateien gleichen Namens, aber unterschiedlicher 
Schreibweise genutzt werden? Was gewinnt man dadurch, außer potentieller 
Verwirrung?

[Nachtrag:
Das von mir als "unixoid" titulierte Betriebssystme ist sogar ein echtes 
Unix, basierend auf BSD]

von g457 (Gast)


Lesenswert?

Genaugenommen redet ihr euch im Kreis drehend am 
Case-Sensitivitäts-Problem vorbei: Das Problem ist, dass
1. Ein Entwickler eine Datei anlegt, die er 'Grützewütze' nennt
2. Er (oder jemand anders, das ist unerheblich) selbige Datei verwenden 
möchte, im Quellcode selbige aber mit 'GrÜtZeWüTzWe' referenziert
3. ★zufälligerweise★ das Betriebssystem die beiden Namen auf die selbe 
Datei abbildet.

Die (einzig richtige) Lösung ist, die Dateien genauso zu benennen wie 
man sie referenziert (oder umgekehrt), alles andere ist und bleibt 
Murks. Und Murks ist dazu da behoben zu werden.

Nix für ungut

von Hc Z. (mizch)


Lesenswert?

Dazu noch eins: Da der Backslash für alle Unix-Abkömmlinge ein normaler 
Bestandteil des Dateinamens ist, ist:

#include "..\src\abc.h"

ein Dateiname ohne jegliche Subdirectories, nicht anders zu 
interpretieren als
1
"___src_abc.h"
  Es ist nicht möglich, daraus nachträglich einen Pfad mit 
Subdirectories zu machen außer durch Konversion der Quelldateien.  Auch 
mit -I-Anweisungen allein ist da nichts zu machen.

von Klaus W. (mfgkw)


Lesenswert?

und zur Entspannung:
die Schreibweise mit / also:
1
#include <avr/io.h>
ist per Definition portabel, sie funktioniert auf jedem
System und ist eindeutig die empfehlenswerte.

von Rolf Magnus (Gast)


Lesenswert?

Rufus t. Firefly schrieb:

> Was den zweiten Punkt des Pfadtrenners angeht, so ist es eine reichlich
> autistische Sichtweise, ein verbreitetes Betriebssystem hartnäckig zu
> ignorieren, auch wenn das Betriebssystem noch so unbeliebt sein mag. Es
> existiert, und es wird in absehbarer Zeit auch keinen Abgang machen.

Und die Abhilfe soll sein, daß man an einer einzelnen ganz spezifischen 
Stelle das verhalten dieses anderen Systems emuliert und sich dadurch 
anders verhält, als es auf dem lokalen System an sämtlichen anderen 
Stellen üblich wäre ('\' ist das Escape-Zeichen)?

> Sinnvolle Präprozessoren sind in der Lage, einfach mit beiden
> Schreibweisen umzugehen, ohne Rücksicht auf ihr Wirtsbetriebssystem
> nehmen zu müssen.

Es gibt auch noch andere Systeme mit völlig anderen Verzeichnistrennern. 
Ich habe auch schon mit VMS gearbeitet. Da sehen Pfade komplett anders 
aus. (*) Muß das dann auch unterstützt werden oder ist das System zu 
unwichtig (nach welchem Kriterium?) um davon unterstützt zu werden?

> Und wenn die Unterscheidung von Groß- und Kleinschreibung in Dateinamen
> auch noch so schick sein mag, hat es wirklich einen Sinn, daß blafusel
> und BLAFUSEL zwei unterschiedliche Dateien sein können?

Hat es denn irgendeinen Nachteil?
Es ist zumindest deutlich einfacher zu handhaben. Bei ASCII ist es ja 
noch einfach, aber sobald du mit Unicode arbeitest, wird es kompliziert. 
("maße" == "MASSE" == "masse"?)

> Gibt es eine wirklich ernstzunehmende Anwendung davon (abgesehen von
> der reichlich verkorksten Konvention, daß .C C++- und .c C-Quelltext
> kennzeichnen soll)?

Ich sehe in der Konvention kein wirkliches Problem, wenn man nicht mit 
einem System arbeiten muß, das das nicht richtig unterscheiden kann.

> Nein. Auch das scheint nur bewusst politisch gehaltene Inkompatilität
> zu anderen Systemen zu sein.

Das ist doch Unsinn. Die case-sensitiven Dateinahmen hatte Unix schon in 
einer Zeit lange bevor es das System gab, zu dem es deiner Behauptung 
nach bewusst inkompatibel sein soll. Letztendlich ist deshalb auch C 
case-sensitiv. Das war dort, wo es herkam, einfach so üblich.
Ich sehe auch keinen wirklichen Vorteil, das jetzt nachträglich zu 
ändern, nur um sich an andere Systeme anzupassen und deren "bewusst 
politisch gehaltene Inkompatilität" zu umgehen.

(*) für Interessierte:
http://de.wikipedia.org/wiki/Virtual_Memory_System#Merkmale

von Daniel H. (dl7vkj)


Lesenswert?

Das war nicht als Angriff auf Windows gedacht. Aber / ist per Definition 
das Zeichen für Pfadtrenner in C. Je nach Betriebssystem wird es dann 
halt vom Präprozessor ersetzt. Und die Tatsache, dass es Betriebssysteme 
gibt, die zwischen Groß- und Kleinschreibung unterscheiden, macht es aus 
meiner Sicht sinnvoll, dass dies auch von C unterstützt wird.
Noch blöder wäre es doch, wenn für jedes Betriebssystem ein eigener C 
Standard existieren würde. Das ist doch letztendlich auch nur eine 
Konvention, die die Portierbarkeit erhöhen soll.

Ansonsten kann ich nur empfehlen, in Dateinamen von C-Quelltext 
ausschließlich ASCII Kleinbuchstaben und den Unterstrich _ zu verwenden 
und zwar mit den Endungen .c für C, .cpp für C++ und .h für Header 
Dateien. Eventuell die Endung .hpp für C++ Header.

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


Lesenswert?

Daniel Heydemann schrieb:

> Aber / ist per Definition
> das Zeichen für Pfadtrenner in C.

Wo hast du diese Definition denn her?

Alle Headerdateien, auf die sich der C-Standard bezieht, kommen
ohne Pfadnamenskomponenten aus.

> Je nach Betriebssystem wird es dann
> halt vom Präprozessor ersetzt.

Kann sein, dass manche Compiler (VMS?) das tun, aber im Falle von
Windows ist es einfach das Betriebssystem selbst, das den
Vorwärtsschrägstrich als Pfadnamentrenner versteht -- parallel zum
Rückwärtsschrägstrich, und das schon seit mindestens MS-DOS 3.30
(vermutlich noch früher).  Lediglich die Kommandozeilenverarbeitung
(command.com bzw. cmd.exe) kommen damit nicht klar, weil sie von
CP/M die Vorwärtsschrägstriche mal als Optionstrenner geerbt haben.

Da aber praktisch alle derzeit in Benutzung befindlichen
Betriebssysteme mit dem Vorwärtsschrägstrich klar kommen, gibt es in
der Tat keinen Grund, ihn nicht zu benutzen an den Stellen, wo das bei
#include notwendig sein sollte.  Da die Windows-Dateisysteme
heutzutage außerdem gar nicht so "case insensitive" sind, wie immer
behauptet (*), sollte man außerdem für maximale Portabilität darauf
achten, dass die Schreibweise des Dateinamens bei #include genauso ist
wie die, mit der die Datei im Dateisystem tatsächlich angelegt worden
ist.  (Jeweils alles in Kleinbuchstaben zu halten ist natürlich der
einfachste Lösungsansatz dafür, aber nicht der einzige.)

(*) Alle derzeitigen Dateisysteme auch unter Windows können sehr wohl
Groß- und Kleinbuchstaben im Dateinamen selbst unterscheiden.
Lediglich die Suchfunktionen sind so implementiert, dass sie danach
nicht mehr unterscheiden, was zur Folge hat, dass die Groß-/
Kleinschreibung eines Dateinamens ausschließlich beim Anlegen
festgelegt werden kann und dann "in Stein gemeißelt" ist.  Wenn man
die Datei hinterher umbenennen möchte und dabei lediglich die Groß-/
Kleinschreibung ändern will, wird dies natürlich abgelehnt, weil ja
vermeintlich der Zielname bereits existiert.

> und zwar mit den Endungen .c für C, .cpp für C++ und .h für Header
> Dateien. Eventuell die Endung .hpp für C++ Header.

Huh. :-)  Andere Leute schwören auf .cc oder .cxx für C++-Dateien. ;-)
(OK, Leute, bei denen nicht nur das Dateisystem sondern auch das
Betriebssystem case sensitive arbeitet, nehmen dann auch noch .C
dafür...)

Einen Sinn in .hpp (oder .hxx) sehe ich überhaupt nicht.  C++ scheint
ja mittlerweile komplett die Dateinamenssuffixe außen vor lassen zu
wollen und benutzt nur noch #include <iostream> etc.

von Juergen (Gast)


Lesenswert?

JTC1/SC22/WG14 N843 (Draft C99 Standard, der Standard selbst ist nicht 
frei verfügbar):

6.4.7  Header names

[#3]  If  the  characters  ',  \,  ", //, or /* occur in the
       sequence between the < and >  delimiters,  the  behavior  is
       undefined.   Similarly,  if  the  characters ', \, //, or /*
       occur in the sequence between the " delimiters, the behavior
       is  undefined.56)  A  header  name  preprocessing  token  is
       recognized only within a #include preprocessing directive.

Der gleiche Spruch steht ohne // schon bei ANSI C.

Also hat \ in Header-Dateinamen nicht verloren, auch wenn es zufällig 
bei einem bestimmten Compiler unter einem bestimmeten Betriebssystem 
damit funktioniert.

von Daniel H. (dl7vkj)


Lesenswert?

Jörg Wunsch schrieb:

> Wo hast du diese Definition denn her?
> ...
> Kann sein, dass manche Compiler (VMS?) das tun, aber im Falle von [...]
Manche Compiler ist etwas unter trieben, die meisten trifft es eher. Es 
ist also eine "Quasi-Standard". Was aber auch nichts daran ändert, dass 
in ISO/IEC 9899:1999 folgendes steht: "If the characters ', \, ", //, or 
/* occur in the sequence between the < and > delimiters,
the behavior is undefined."


> Huh. :-)  Andere Leute schwören auf .cc oder .cxx für C++-Dateien. ;-)
Nun, das muss ich ja aber nicht empfehlen... ;-)

>
> Einen Sinn in .hpp (oder .hxx) sehe ich überhaupt nicht.
Das habe ich früher benutzt, damit emacs die Header im C++ Mode öffnet.

von Klaus W. (mfgkw)


Lesenswert?

Daniel Heydemann schrieb:
> Das habe ich früher benutzt, damit emacs die Header im C++ Mode öffnet.

Guter Punkt, aber dafür tun es auch diese Zeilen am Ende der Datei:
1
// Local Variables:
2
// mode:C++
3
// End:

Dann kann die Datei heißen, wie sie will.

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


Lesenswert?

Daniel Heydemann schrieb:

>> Kann sein, dass manche Compiler (VMS?) das tun, aber im Falle von [...]

> Manche Compiler ist etwas unter trieben, die meisten trifft es eher.

Zeig mir bitte ein Beispiel.  Zur Erinnerung, der Kontext dazu (den
du falsch zitiert hast) war, dass der Präprozessor da irgendwas
ersetzen würde.  Das glaube ich dir so einfach nicht, also zumindest
nicht für MacOS, alle Arten von Unix oder Windows.

> Was aber auch nichts daran ändert, dass
> in ISO/IEC 9899:1999 folgendes steht: "If the characters ', \, ", //, or
> /* occur in the sequence between the < and > delimiters,
> the behavior is undefined."

Das beschreibt allerdings nicht, das Vorwärtsstriche vom C-Standard
als Pfadnamentrenner definiert wären (wie du behauptet hast),
sondern das besagt nur, dass Rückwärtsschrägstriche ausdrücklich als
unportabel ausgeschlossen sind, was natürlich Sinn hat, weil man auf
diese Weise dem Compiler überlässt, wann er Dinge wie \t bewertet, wie
sie beispielsweise bei
1
#include <util\twi.h>

auftreten könnten.

von P. S. (Gast)


Lesenswert?

Rolf Magnus schrieb:

> Hat es denn irgendeinen Nachteil?

Es ist voellig unnatuerlich. Ich hatte mal einen Kollegen, der meinte 
auch immer, das sei die einzig richtige Variante, weil sein Unix das 
schon immer so gemacht hat. Der Groschen fiel, als er seiner Mutter am 
Telefon mal einen langen Pfad diktieren musste, der reichlich 
Gross-/kleinschreibung verwendet hat. Einfach Erkenntnis: Nur die 
Schriftsprache kennt die Gross-/kleinschreibung und sie hat praktisch 
keine syntaktische Bedeutung. Nicht umsonst haben es die meisten Systeme 
schon immer anders gemacht. Windows ist da eher ein Spaetling, die haben 
das Problem halt frueher umgangen, indem sie nur Grosschreibung 
verwendet haben, als andere Systeme das laengst richtig gemacht haben.

von Sven P. (Gast)


Lesenswert?

Wenn hier im Forum jemand ohne Umschalttaste schreibt, dann ist das 
m.M.n. recht unnatürlich.

Es rührt vielleicht auch daher, dass simple Byteweise-Vergleiche 
einfacher und schneller sind, als Vergleiche ohne Beachtung von Groß- 
und Kleinschreibung. Es gibt ja auch noch Unicode.

von Klaus W. (mfgkw)


Lesenswert?

Was passiert, wenn bei Microsoft eine Lampe kaputt geht?

Die anderen werden auch alle zerschlagen, und die
Dunkelheit wird zum Industriestandard erklärt!

von Daniel H. (dl7vkj)


Lesenswert?

Jörg Wunsch schrieb:
> Zeig mir bitte ein Beispiel.  Zur Erinnerung, der Kontext dazu (den
> du falsch zitiert hast) war, dass der Präprozessor da irgendwas
> ersetzen würde.  Das glaube ich dir so einfach nicht, also zumindest
> nicht für MacOS, alle Arten von Unix oder Windows.
Intern muss es der Präprozessor sehr wohl ersetzen, da er ja die Dateien 
finden und einsetzen muss.

> Das beschreibt allerdings nicht, das Vorwärtsstriche vom C-Standard
> als Pfadnamentrenner definiert wären (wie du behauptet hast),
Da hast Du vollkommen recht, mein Fehler. Aber als "quasi" bzw. "de 
facto" Standard wird es von vielen Compilern/Präprozessoren verstanden. 
Zumindest fallen mir spontan µVision, Keil, cpp und MSVC ein.

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


Lesenswert?

Daniel Heydemann schrieb:
> Intern muss es der Präprozessor sehr wohl ersetzen, da er ja die Dateien
> finden und einsetzen muss.

Nein.  Du hast meinen Beitrag oben entweder nicht gelesen oder
nicht verstanden:

Beitrag "Re: Header Dateien Groß/Kleinschreibung"

Windows selbst kommt mit den Vorwärtsschrägstrichen zurecht.  Der
Präprozessor macht weiter nichts als ein
1
 f = fopen("avr/io.h", "r");

...und die Datei wird: ganz einfach gefunden.

von Daniel H. (dl7vkj)


Lesenswert?

Jörg Wunsch schrieb:

> Nein.  Du hast meinen Beitrag oben entweder nicht gelesen oder
> nicht verstanden:
Nicht richtig gelesen. Ich dachte immer, dass Windows den Schrägstrich 
in Pfadangaben erst ab Windows 2000 unterstützt. Also kein Wunder, dass 
auch die ganzen Compiler vor W2k mit dem Schrägstrich zurecht gekommen 
sind. Und wenn der Schrägstrich nativ unterstützt wird muss natürlich 
auch nichts ersetzt werden. Die Vorstellung der Schrägstrich sei ein 
(Verabredeter) Standard ist dann obsolet, vielmehr entspringt sie der 
Erfahrung, dass alle C-Compiler unter Linux, DOS und Windows, mit denen 
man je gearbeitet hat, ihn scheinbar unterstützen. Scheinbar deswegen, 
weil ihn in Wirklichkeit schon DOS 3.x nativ unterstützte.

von Karl H. (kbuchegg)


Lesenswert?

Daniel Heydemann schrieb:
> Die Vorstellung der Schrägstrich sei ein
> (Verabredeter) Standard ist dann obsolet,

Wobei: Ganz so unrecht hast du nicht.
Mit einem / ist man oft auf der sicheren Seite, viele Präprozessoren 
erkennen das tatsächlich. So zb viele der C-Compiler, die für das oben 
angesprochene VMS gebaut wurden, bei dem die Directorysyntax ja völlig 
anders aussieht

Fazit: Mit einem / kann man erst mal nicht viel falsch machen. Mit ein 
bischen Glück funktioniert er auf den interessierenden Compilern. Wenn 
nicht, muss man auf die native Syntax des BS ausweichen.

Von daher kann der Rat an den TO nur lauten:
Versuch nicht, das mittels irgendwelcher Werkzeuge zu korrigieren, 
sondern bring die Originalentwickler dazu, die Syntax im Original 
anzupassen. Das kostet ihnen nichts, bringt keine Nachteile und erspart 
eine Fehlerquelle bei der Portierung.

Wenn die Entwickler Profis sind, dann MUSS ihre Antwort lauten:
Oh. Das haben wir übersehen. Danke für den Hinweis
und sie werden das ändern.

von P. S. (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:

> Wenn die Entwickler Profis sind, dann MUSS ihre Antwort lauten:
> Oh. Das haben wir übersehen. Danke für den Hinweis
> und sie werden das ändern.

Du bist ja ein Zyniker... :-/

von Sven P. (Gast)


Lesenswert?

Was mir noch auffällt:

Christian J. schrieb:
> Du must die include verzeichnisse, di emit den Headern als parameter an
> gcc übergeben. für Linux: -I./include für Windows:-I.\include. Das
> machst du für alle verzeichnisse, in denen .h Dateien liegen.
>
> du kannst gcc auch merere übergeben.
>
1
gcc -I.\include -I.\include2 -I.\include3 ...

Das wird unter gängigen Shells sowieso in die Hose gehen. Bestenfalls 
wird der gcc dann nach '.include', '.include2' und '.include3' suchen.

von Karl H. (kbuchegg)


Lesenswert?

Peter Stegemann schrieb:
> Karl heinz Buchegger schrieb:
>
>> Wenn die Entwickler Profis sind, dann MUSS ihre Antwort lauten:
>> Oh. Das haben wir übersehen. Danke für den Hinweis
>> und sie werden das ändern.
>
> Du bist ja ein Zyniker... :-/

:-)
So war das gar nicht gemeint. Ehrlich!

Worauf ich hinaus wollte:
Keine Hemmungen, wenn man zu den Profis geht und sie um diese Änderung 
bittet. Das ist für die Originalprogrammierer ein Klacks und tut nicht 
weh. Da muss kein Bugreport geschrieben werden oder eine 
Entwicklersitzung einberufen werden oder dergleichen.

Streubt sich jemand gegen eine derartige Änderung, dann ist er ein 
bornierter Stubenhocker, der noch nie ein Programm von A nach B portiert 
hat. Da warten noch ganz andere Probleme. Dagegen ist das hier ein 
'Lercherlschas'

von jeromert (Gast)


Lesenswert?

Vielen Dank für die Antworten. Anscheinend gibt es keine andere Lösung 
als das Programm zu ändern. Ich hatte gehofft, es gibt irgendeine Option 
im gcc, mit der man das Problem umgehen kann.


Karl heinz Buchegger schrieb:
> Keine Hemmungen, wenn man zu den Profis geht und sie um diese Änderung
>
> bittet. Das ist für die Originalprogrammierer ein Klacks und tut nicht
>
> weh. Da muss kein Bugreport geschrieben werden oder eine
>
> Entwicklersitzung einberufen werden oder dergleichen.

Das Problem ist, es handelt sich um ein Projekt mit insgesamt 467 
Dateien.
Ich habe zwar schon ein Shellscript geschrieben, das die Änderungen 
automatisch durchführt, aber allein das Überprüfen, ob Fehler ( durch 
den Script) aufgetreten sind würde sehr sehr lange Dauern.
Da die Zielplattform ein Mikrocontroller ist, bin ich auf Windows in 
Verbindung mit Cygwin umgestiegen, es klappt auch ganz gut.

Jörg Wunsch schrieb:
>> Was aber auch nichts daran ändert, dass
>
>> in ISO/IEC 9899:1999 folgendes steht: "If the characters ', \, ", //, or
>
>> /* occur in the sequence between the < and > delimiters,
>
>> the behavior is undefined."

Hätte der gcc Compiler in Windows von Anfang an bei falscher Einbindung 
von Headern gemeckert, dann hätte ich das Problem jetzt nicht ...

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


Lesenswert?

jeromert schrieb:

> Ich habe zwar schon ein Shellscript geschrieben, das die Änderungen
> automatisch durchführt, aber allein das Überprüfen, ob Fehler ( durch
> den Script) aufgetreten sind würde sehr sehr lange Dauern.

Huh?  Einmal die Ausgabe von »svn diff« reviewen um zu sehen, dass
sich nicht mehr als die #include-Zeilen geändert haben, wie lange
dauert das denn?  Ich denke, dass man nach einer Stunde fertig sein
sollte.
1
svn diff | grep '^[-+]' | grep -E -v '^((---)|([+][+][+])) ' | grep -v '#include'

darf nichts mehr ausgeben, wenn sich nur #include-Zeilen geändert
haben.

> Hätte der gcc Compiler in Windows von Anfang an bei falscher Einbindung
> von Headern gemeckert, dann hätte ich das Problem jetzt nicht ...

Schreib den GCC-Leuten einen Bugreport, dass sie das gemäß Standard
undefinierte Verhalten bitte warnen sollen.  Ich denke, dass diese
Anforderung legitim ist, wenn das so im Standard geschrieben steht
(zumal dort "undefined" steht, nicht etwa "implementation-defined").

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.