Wirkungsgrad von 100 m RG213U

Du meinst Passagen im Stadard?

Nein, so konnte ich das nicht verstehen. Für mich ist der C-Standard 1 Text.

Nicht so ganz, die Zeilenenden müssen für den Compiler weiterhin sichtbar bleiben.

Das ist beim Präprozessor nicht anders. Der übersetzt nichts, wandelt nur den Quelltext um. Als eigenständiges Programm kann er jeden Text überarbeiten.

Da scheinen ANSI und ISO getrennte Wege zu gehen?

Wenn ich mich schon mit ungeliebten Sprachen beschäftigen muß, dann bitte gleich richtig (C++, enthält C) und nicht nur ein Teilchen davon.

DoDi

Reply to
Hans-Peter Diettrich
Loading thread data ...

In Delphi (OPL) ist ein Garbage-Collektor eingebaut, den es so für C/C++ nicht gibt und (wegen Kompatibilitätsproblemen) nicht geben wird.

DoDi

Reply to
Hans-Peter Diettrich

Ja, natürlich. Ein Bezug auf andere Texte außerhalb des Standards wäre ja Unfug.

Ein Text kann auch beliebig in Texte (Textteile, Textstellen) aufgeteilt werden. Prolog, Epilog und Kapitel können auch als verschiedene Texte innerhalb eines Romans gelten. Den vollen Text ... Teil oder Ganzes eines Textes ... Einen Text aus der Bibel ...; Das kann auch nur ein Satz sein.

Für Fortsetzungszeilen gilt das nicht: |Each instance of a backslash character (\) immediately followed by a new-line character is |deleted, splicing physical source lines to form logical source lines.

Vorstehenden Satz hast Du gelöscht. Die gelöschten Zeichenfolgen '\NL' sind für den Compiler weiterhin _nicht_ sichtbar.

Der Präprozessor ist kein Kommando, sondern nur 'cc' oder 'clang' sind hier Kommandos. Der Präprozessor kann nur Texte in gültigem C (eine C-Quelle) bearbeiten.

Nein, gar nicht. ISO und IEC sind internationale Organisationen. ANSI ist eine US-amerikanische Organisation, die ISO-Standards übernimmt, so wie auch DIN.

C++ wird von der WG21 bearbeitet, einer anderen Workgroup.

formatting link

Reply to
Helmut Schellong

Das Entfernen von \NL ist erst nach Entfernen von // Kommentaren möglich, und diese Entfernung muß \NL beibehalten. Mir ist nicht ganz klar, wie sich dieses Entfernen z.B. auf String-Literale auswirkt, die sich über mehrere Zeilen erstrecken. Vielleicht gibt es noch mehr Stellen, an denen Zeilenenden weiterhin bedeutsam sein können.

Das gilt nur für den Präprozessor als Teil eines Compilers, *nicht* für einen *selbständigen* Präprozessor. Der ursprünglich selbständige Präprozessor konnte und kann weiterhin zur Bearbeitung beliebiger Texte verwendet werden. Seitdem hat es aber im C/C++ Parser Änderungen gegeben, die eine unabhängige Vorbereitung solcher Quellen nicht mehr zuläßt.

DoDi

Reply to
Hans-Peter Diettrich

Ich habe noch nie Zeilenkommentare //... innerhalb einer PP-Zeile geschrieben. Sondern nur /*...*/. Noch nie habe ich /*...*/ über Zeilenverlängerungen \NL hinweg geschrieben. Das wäre auch nie sinnvoll gewesen.

Zeichenfolgen '\NL' werden in Translation phase 2 gelöscht. Kommentare werden in Translation phase 3 gelöscht. Phase 2 hat folglich Vorrang. Das weiß ich schon lange. Auch "...//..." (") hat Vorrang durch Maskierung.

Ein vom Compiler unabhängig aufrufbarer Präprozessor ist mir gänzlich unbekannt. Es sei denn, es handelt sich um Unix-Kommandos wie 'tr' und ähnlich.

Beispielsweise werden Kommentare durch ein Leerzeichen ersetzt. Damit nicht neue Tokens unkontrolliert entstehen.

#if 0 rreiuegkööekwq ea ä #endif

"rreiuegkööekwq ea ä" "rreiuegk\224\224ekwq ea \204"

Ich hatte in den beiden vorstehenden Fällen schon ERROR erlebt. Bei alten Compilern, die non-ASCII nirgendwo in der Quelle akzeptierten.

Reply to
Helmut Schellong

Hallo Helmut,

Du schriebst am Wed, 27 Sep 2023 16:51:49 +0200:

Geht aber alles. Du kannst auch beliebige Kommentare in Makro-Defintionen einbauen, sauber formatiert mit "\NL" (wie Du das schreibst).

...

Du hast den "cc" selber genannt.

Reply to
Sieghard Schicktanz

Na dann Tschüss!

DoDi

Reply to
Hans-Peter Diettrich

Am 27.09.2023 um 21:23 schrieb Sieghard Schicktanz:

Vorher: # define HKL cccccccccccccccc \ ddd //kkkkkkkkkk \ eeeeeeeeeeeeeeee

Nachher 1: # define HKL cccccccccccccccc ddd //kkkkkkkkkk eeeeeeeeeeeeeeee

Nachher 2: # define HKL cccccccccccccccc ddd

Das ist aber in die Hose gegangen. Es fehlt nun 'eeeeeeeeeeeeeeee'.

Das ist aber kein vom Compiler unabhängig aufrufbarer Präprozessor, sondern 'cc' IST der Compiler.

Reply to
Helmut Schellong

Das ist das Compiler-Frontend, das cpp/cc/... aufruft.

Du meinst "cpp".

cu Michael

Reply to
Michael Schwingen

Die Realität ist seit vielen Jahren anders:

----------------------------------------------------------------------------------------------

-r-xr-xr-x 6 root wheel 95122720 Apr 7 06:25 /usr/bin/clang

-r-xr-xr-x 6 root wheel 95122720 Apr 7 06:25 /usr/bin/cc

-r-xr-xr-x 6 root wheel 95122720 Apr 7 06:25 /usr/bin/clang-cpp

-r-xr-xr-x 6 root wheel 95122720 Apr 7 06:25 /usr/bin/cpp

-r-xr-xr-x 6 root wheel 95122720 Apr 7 06:25 /usr/bin/clang++

-r-xr-xr-x 6 root wheel 95122720 Apr 7 06:25 /usr/bin/c++

142] cc -### /u/bsh/bsh.c "/usr/bin/cc" "-cc1" "bsh.c" "-o" "/tmp/bsh-2a6c29.o" "-x" "c" "/u/bsh/bsh.c" "/usr/bin/ld" "-o" "a.out" "/usr/lib/crt1.o" "/usr/lib/crti.o" "/usr/lib/crtbegin.o" "-L/usr/lib" "/tmp/bsh-2a6c29.o" "-lc" "/usr/lib/crtend.o" "/usr/lib/crtn.o"

143] cc -### -S /u/bsh/bsh.c "/usr/bin/cc" "-cc1" "-S" "bsh.c" "-o" "bsh.s" "-x" "c" "/u/bsh/bsh.c"

----------------------------------------------------------------------------------------------

Oben ist die eine Executable 6-fach verlinkt (Hardlinks). /usr/bin liegt im PATH. 'cpp' bedeutet 'cplusplus'. Extern existiert nur der Linker 'ld'. Präprozessor und Assembler existieren nicht extern, sondern nur in der einen großen Executable (95 MB).

Ich schrieb bereits, daß es dem C-Standard egal ist, wie die Sprache C implementiert ist. Der Standard definiert den gültigen Inhalt einer C-Quelle, bis ins feinste Detail, und die C-Libraries. Es dürften auch alle Header-Dateien: z.B. <stdio.h>, in der einen großen Exe enthalten sein.

Die Compiler-Option -### bewirkt einen cold-run, der _alle_ aufgerufenen Kommandos zeigt.

=====================================================================================================

142] cc -### /u/bsh/bsh.c FreeBSD clang version 14.0.5
formatting link
llvmorg-14.0.5-0-gc12386ae247c) Target: x86_64-unknown-freebsd13.2 Thread model: posix InstalledDir: /usr/bin "/usr/bin/cc" "-cc1" "-triple" "x86_64-unknown-freebsd13.2" "-emit-obj" "-mrelax-all" "--mrelax-relocations" "-disable-free" "-clear-ast-before-backend" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "bsh.c" "-mrelocation-model" "static" "-mframe-pointer=all" "-ffp-contract=on" "-fno-rounding-math" "-mconstructor-aliases" "-funwind-tables=2" "-target-cpu" "x86-64" "-tune-cpu" "generic" "-mllvm" "-treat-scalable-fixed-error-as-warning" "-debugger-tuning=gdb" "-fcoverage-compilation-dir=/u" "-resource-dir" "/usr/lib/clang/14.0.5" "-fdebug-compilation-dir=/u" "-ferror-limit" "19" "-fgnuc-version=4.2.1" "-faddrsig" "-D__GCC_HAVE_DWARF2_CFI_ASM=1" "-o" "/tmp/bsh-2a6c29.o" "-x" "c" "/u/bsh/bsh.c" "/usr/bin/ld" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld-elf.so.1" "--hash-style=both" "--enable-new-dtags" "-o" "a.out" "/usr/lib/crt1.o" "/usr/lib/crti.o" "/usr/lib/crtbegin.o" "-L/usr/lib" "/tmp/bsh-2a6c29.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "/usr/lib/crtend.o" "/usr/lib/crtn.o"

143] cc -### -S /u/bsh/bsh.c FreeBSD clang version 14.0.5

formatting link
llvmorg-14.0.5-0-gc12386ae247c) Target: x86_64-unknown-freebsd13.2 Thread model: posix InstalledDir: /usr/bin (in-process) "/usr/bin/cc" "-cc1" "-triple" "x86_64-unknown-freebsd13.2" "-S" "-disable-free" "-clear-ast-before-backend" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "bsh.c" "-mrelocation-model" "static" "-mframe-pointer=all" "-ffp-contract=on" "-fno-rounding-math" "-mconstructor-aliases" "-funwind-tables=2" "-target-cpu" "x86-64" "-tune-cpu" "generic" "-mllvm" "-treat-scalable-fixed-error-as-warning" "-debugger-tuning=gdb" "-fcoverage-compilation-dir=/u" "-resource-dir" "/usr/lib/clang/14.0.5" "-fdebug-compilation-dir=/u" "-ferror-limit" "19" "-fgnuc-version=4.2.1" "-faddrsig" "-D__GCC_HAVE_DWARF2_CFI_ASM=1" "-o" "bsh.s" "-x" "c" "/u/bsh/bsh.c" =====================================================================================================

Reply to
Helmut Schellong

Hier nicht.

lrwxrwxrwx 1 root root 6 Jan 11 2021 /usr/bin/cpp -> cpp-10 lrwxrwxrwx 1 root root 23 Jan 10 2021 /usr/bin/cpp-10 -> x86_64-linux-gnu-cpp-10

$ dpkg -S /usr/bin/cpp-10 /usr/bin/cpp cpp-10: /usr/bin/cpp-10 cpp: /usr/bin/cpp

Package: cpp-10 Description-en: GNU C preprocessor A macro processor that is used automatically by the GNU C compiler to transform programs before actual compilation. . This package has been separated from gcc for the benefit of those who require the preprocessor but not the compiler.

Der GNU c++-Compiler heisst "c++", nicht "cpp".

cu Michael

Reply to
Michael Schwingen

Holger Schieferdecker schrieb:

Bjarne Stroustrups Ergänzung für C++: “In C++ it’s harder to shoot yourself in the foot, but when you do, you blow off your whole leg.”

Reply to
Rolf Bombach

Helmut Schellong schrieb:

Jou. Und alle drei Jahre einen neuen C++-Standard. Haste schon C++23/26?

Reply to
Rolf Bombach

Hallo Helmut,

Du schriebst am Thu, 28 Sep 2023 08:51:33 +0200:

Nee, warum? Der Kommentar hinter "//" bis zum Ende der Gesamtzeile fehlt doch durchaus ordnungsgemäß. Aber was soll Dein "Nachher 1" sein? _Das_ ist eine Zwischenaktion des Präprozessors, die nicht nach außen sichtbar ist. Ansonsten schaut die Ausgabe des Präprozessors (hier: cpp) so aus:

$ cpp cct.c # 0 "cct.c" # 0 "<built-in>" # 0 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 0 "<command-line>" 2 # 1 "cct.c"

Jawoisserdenn? Wo ist denn der Makro-Text geblieben? Da gibt's nur leere Zeilen, wo die Definition gestanden haben könnte, und sonst nischt? Vielleich hilft ein Makro-Aufruf dahinter... So:

$ cpp cct.c # 0 "cct.c" # 0 "<built-in>" # 0 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 0 "<command-line>" 2 # 1 "cct.c"

cccccccccccccccc ddd

Ja, daisserja! Die Zeile mit dem Makro-Text kommt also _nur dann_, wenn das Makro auch ausgeführt wird und seinen Inhalt in das Ausgabe-File ergießt.

Nein, das ist auch nicht der Compiler, das ist der "Compiler Controller". Aber Du hast insofern recht, als der Präprozessor den Namen "cpp" hat, so wie ich ihn oben auch aufgerufen habe. Ein "cc -E" wäre auch gegangen, dann wird gleich nach dem Präprozessor-Aufruf aufgehört und dessen Ausgabe landet auf dem Bildschirm.

Reply to
Sieghard Schicktanz

Am 28.09.2023 um 20:49 schrieb Rolf Bombach:

Ich habe den Draft C++20, und ein sehr dickes Buch von Stroustrup.

Major-C-Standards gab es bisher nur: C89:C90, C99, C11. C23 wird höchstwahrscheinlich 2023 kommen. C-Standards gibt es folglich nur alle 10..12 Jahre.

formatting link
Vorstehend das Deckblatt eines gekauften C-Standards C11. Die haben meinen Namen mit Lizenz auf jede Seite unten gedruckt.

Reply to
Helmut Schellong

Ich habe unter FreeBSD (clang) auch den gcc12 als PKG installiert. Der hat separat '/usr/local/bin/cpp' (Preprocessor). /usr/bin/cpp ist der offizielle System-Compiler clang-c++.

Reply to
Helmut Schellong

Am 28.09.2023 um 20:55 schrieb Sieghard Schicktanz:

Vorher: # define HKL ccccc \ ddd //kkkkk \ eeeee

Nachher 1: # define HKL ccccc ddd //kkkkk eeeee

Nachher 2: # define HKL ccccc ddd

'Nachher 1' ist der Zustand nach translation phase 2: Löschen von \NL. Dadurch rutscht eeeee unbeabsichtigt in den Kommentar hinein und verschwindet in phase 3. Zeilenkommentare funktionieren folglich nicht innerhalb von Zeilenverlängerungen.

Das ist doch der geltende Kontext. Habe ich in vorhergehenden Postings erklärt.

[...]

Du konterkarierst durch Deine Argumentation: >>>> Ein vom Compiler unabhängig aufrufbarer Präprozessor ist mir gänzlich >>>> unbekannt. Es sei denn, es handelt sich um Unix-Kommandos wie 'tr' und >>>> ähnlich. >>>

Der cpp interessiert mich einfach gar nicht. Der Compiler (inklusive PP) wird _grundsätzlich_ über sein Frontend aufgerufen. G R U N D S Ä T Z L I C H !!! Ich werde niemals einen externen PP verwenden. Ich wüßte gar nicht, warum überhaupt! Ich habe die man-page zu 'cpp' gelesen und lasse den externen cpp fallen wie eine heiße Kartoffel! Der paßt ja gar nicht richtig! Dessen Verwendung ist risikoreich! 'cc -E' ist der einzig richtige Weg.

Kenne ich seit den 1980ern. Die 5 verschieden umfangreichen Aufgaben eines C-Compilers habe ich in meinen C-Büchern erklärt.

Reply to
Helmut Schellong

Ist das so wie bei MS, daß man da ständig (zwangs)updaten muß, oder darf man noch eine Weile C++ 20 weiterprogrammieren?

SCNR, Volker

Reply to
Volker Bartheld

Hallo Helmut,

Du schriebst am Thu, 28 Sep 2023 23:57:51 +0200:

Den Zustand gibt es nur innerhalb des Präprozessors als Zwischenschritt zur Vorbereitung der Verarbeitung, und in dem Fall sogar noch vor der _Definition_ des Makros.

Nein, tut er nicht - dieser Teil _war_ schon _von Anfang an_ "im Kommentar", bzw. ein Teil davon. Die Sequenz "\NL" (ich bleib' mal bei dieser Schreibweise) ist _nicht_ Teil des Programmtextes. Folglich ist die gesamte Makro-Definition genau _eine_ Zeile, wie das ja auch verlangt ist.

Nein, da "verschwidet" nichts.

Ja, falsch.

Eigentlich nicht - der "cpp" _ist_ e"in vom Compiler unabhängig aufrufbarer Präprozessor". Na schön, bei Dir könnte ich mir schon vorstellen, daß der Dir bis dato "gänzlich unbekannt" war...

Kannsr Du so halten, und das ist im Normalfall auch durchaus sinnvoll, weil sich dann der Compiler-Controller (Steuerprogramm für die Kompilation) um alles für die Programmerstellung nötige kümmert.

Es verlangt ja auch niemand von Dir. Aber manchmal ist es halt _dich_ nützlich, das Ergebnis dess Präprozessor zu sehen, z.B. wenn man fremde Makros benutzt (was durchaus vorkommt...) und sich nicht sicher ist, ob die im "#include"-Wust auch richtig umgesetzt werden, insbesondere wenn da viele symbolesteuerte bedingte Makro-Expansionen drinstecken.

Das ist die identische Funktion, halt indirekt über das Steuerprogramm.

Reply to
Sieghard Schicktanz

Nein, Du kannst den C-Standard und auch den C++-Standard komplett ignorieren und einen Compiler Deiner Wahl in beliebiger Weise verwenden. Bis zu Deinem Lebensende.

Es kann natürlich sein, daß ein Arbeitgeber bestimmte Verhaltensweisen vom Programmierer verlangt. Kunden eines Arbeitgebers können auch bestimmte Vorgänge bei diesem Arbeitgeber verlangen. Beispielsweise kann verlangt werden, daß mindestens der Standard C99 als umfassende Arbeitsbasis verwendet wird, und daß bestimmte Testverfahren verwendet werden.

Ich halte von allem diesem eigentlich nichts. Programmierer sollen einfach talentiert, bestens geeignet und angemessen entlohnt sein. Davon hängt alles ab.

Reply to
Helmut Schellong

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.