(gelöst) [C++]const eines Parameters für Linker relevant?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.

(gelöst) [C++]const eines Parameters für Linker relevant?

Beitragvon Krishty » 30.03.2018, 11:09

Sagen wir, ich habe zwei .cpp-Dateien.

Die eine definiert eine Funktion

  void foo(int * const x) {
    // tut nix weil Beispiel
  }


In der anderen .cpp wird diese Funktion deklariert:

  void foo(int *); // KEIN CONST!

Visual C++ kann dann nicht mehr kompilieren (Linkerfehler, Funktion nicht gefunden).

Ich bin mir recht sicher, dass das ein Linker-Bug ist:
  • Ich glaube, der C++-Standard schreibt vor, dass const an by-value-Parametern keine Auswirkungen auf die Signatur hat. (Weil es ein Detail der Implementierung ist und in der Deklaration nichts verloren hat.)
  • Wenn man die Deklaration vor die Definition kopiert, kompiliert es plötzlich. (Das entspricht etwa dem #include eines Headers.)
  • Wenn man die Funktion von int *-Parameter zu int-Parameter ändert, kompiliert alles. Das passiert irgendwie nur mit Zeigern. (Ich hatte vor fünf Jahren ein Ticket eröffnet mit int als Beispiel. Mich beschleicht das Gefühl, dass sie nur den Fall gefixt und Zeiger vergessen haben.)
Liege ich damit richtig? Hat zufällig jemand die richtigen Paragraphen zur Hand? Dann kann ich nämlich direkt einen Bug Report anlegen.
Zuletzt geändert von Krishty am 31.03.2018, 13:53, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
 
Beiträge: 6476
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: [C++] const-ness eines Parameters für Linker relevant?

Beitragvon dot » 30.03.2018, 12:49

Da geht wohl beim Name-Mangling was in die Hose...

Du suchst vermutlich das hier: http://eel.is/c++draft/dcl.fct#5

Demo dass du vermutlich richtig liegst: https://godbolt.org/g/idkLCh

Edit 2: LOL! Auch MSVC beschwert sich bei obigem Code dass die Funktion bereits definiert wurde. Sobald die Implementierung aber in einem anderen File liegt, ist es auf einmal nicht mehr das selbe...


Edit: Du bist wohl nicht der Erste dem das auffällt: https://stackoverflow.com/questions/32447978/odd-vs-name-mangling-behavior/32448512...

Wenn du reportest, bitte verlink den Report hier, dann kann ich gleich upvoten ;)
Benutzeravatar
dot
Michael Kenzel
Establishment
 
Beiträge: 1640
Registriert: 06.03.2004, 19:10

Re: [C++] const-ness eines Parameters für Linker relevant?

Beitragvon Krishty » 31.03.2018, 10:08

Danke dafür, das ist echt aussagekräftig.

Bin übrigens gerade zufällig auf das erste Mal gestoßen, als ich es hier erwähnt habe: viewtopic.php?f=9&t=307&hilit=2006&start=3060#p36226

Die Bug Reports sind mittlerweile gelöscht: viewtopic.php?f=9&t=307&hilit=2006&start=3060#p36232 … aber wenn ich mich recht erinnere, war es sowas wie „fixen wir irgendwann später mal“. (Den template-Bug haben sie aber mittlerweile behoben.)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
 
Beiträge: 6476
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: [C++] const-ness eines Parameters für Linker relevant?

Beitragvon Krishty » 31.03.2018, 10:45

Bittesehr: https://developercommunity.visualstudio ... fiers.html
(Ich sehe ja, wie fleißig du immer upvotest; danke dafür!)

Hat mich bloß eine Stunde gekostet, weil beim Absenden „Access Denied“ angezeigt wurde, der Draft nicht wiederhergestellt werden konnte, und ich dann über die Visual Studio-Feedback-Option melden musste, und das dann meine Formatierung und den Anhang zerstört hat ¯\_(ツ)_/¯

P.S.: Alle Bugs sind hier gelistet: http://krishty.com/bugs.html
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
 
Beiträge: 6476
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy


Zurück zu Programmiersprachen, Quelltext und Bibliotheken

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste