Warum nicht C++ - Unterstützung stark typisierte Auslassungszeichen?

Kann mir jemand bitte erklären, warum C++, zumindest meines Wissens nach gar nicht implementiert, einer stark typisierten Auslassungszeichen Funktion, etwas zum Effekt von:

void foo(double ...) {
 //Do Something
}

Bedeutung, dass, im Klartext zu sprechen: 'kann Der Benutzer übergeben Sie eine variable Anzahl von Bedingungen zu der foo-Funktion, aber alle Bedingungen müssen verdoppelt werden'

  • Ich würde vermuten, dass variadischen Funktionen wurden Hinzugefügt, um C mit dem alleinigen Zweck der Unterstützung der printf-Familie von Funktionen, die müssen Typ-unsicher. Die format-string-I/O-Konzept selbst wurde wahrscheinlich nur genommen von der C ' s Vorgänger wie BCPL (siehe en.wikipedia.org/wiki/BCPL). In modernem C++, es gibt keine Notwendigkeit, type-safe variadischen Funktionen, denn wir haben superior-Konstrukte sowieso, vor allem seit C++11. Leider habe ich keine Referenzen für meine Vermutungen. Es wäre interessant, diese Frage zu stellen, mit Bjarne Stroustrup selbst.
  • Sie tun kann void foo(double *) und nennen es durch foo((double[]){1,2,3,4,5}). Benötigen GNU C++ - Erweiterung.
  • Ist nicht diese Funktion zu anekdotisch zu werden, lohnt sich die Einbindung in ein bereits overfeatured Sprache ? Dann sollte man so gut behaupten void foo(double ..., int ..., double ...) und dergleichen.
  • Es gibt keinen fundamentalen Grund, warum der printf-Familie müssen Typ-unsicher. C könnte haben erklärt, dass die Umsetzung zunächst schiebt sich eine "type-token" auf dem call-stack, so dass die vararg-Mechanismus können überprüfen, dass die richtige Art von Wert wird auf den stack. Das würde verlangsamt haben, richtigen code, und C die in der Vergangenheit eine starke Bevorzugung von schnell oben sicher.
  • Wahr.
  • OTOH, dass immer noch nicht machen es sicher zur compile-Zeit.
  • Tatsächlich, ich denke, das wäre ziemlich nützlich...
  • Ich denke, dass gcc druckt eine Warnung, wenn die printf/scanf-argument die nicht zu den Formatbezeichner, ich bin sicher, ich habe es gesehen.
  • Ich schaffte es Programmieren in C und C++ seit 25 Jahren, ohne jemals das Gefühl der Notwendigkeit für eine Variable Funktion.
  • ja, gut, die Bequemlichkeit der funktionalen Sprachen....
  • In der Tat. Es funktioniert nur, wenn der string eine Konstante, wenn. Das ist genau, warum printf als angegeben können nicht sicher sein, zur compile-Zeit.
  • Es zeigt, wie wenig Pragmatismus könnte eine große Hilfe gewesen, obwohl - diese Warnung hätte incorporated in den K&R C leicht (es ist nicht viel von einer technischen Herausforderung), und würde abgedeckt haben, 99,99% der bugs. Stattdessen wollte Sie werden Puristen und nicht zulassen, dass eine Besondere Behandlung für printf/scanf.
  • template<class T> using id = T; void foo(double*); foo(id<double[]>{1,2,3,4}); funktioniert w/o-Erweiterungen.
  • Eine Typ-sichere version könnte wohl gewesen sein, als Billig und in vielen Fällen billiger als der hack, der implementiert wurde, wenn die drucken-Funktion nahm einen compiler-generierten const char* Beschreibung der Parameter und der Compiler könnte wählen Sie die vorbeifahrenden Mittel als angemessen, so int a; long b; print(1, 0x12345, a, b, a+b) einen compiler erzeugen könnte einen temp-holding a+b, und übergeben Sie ein static const char[] enthält, codiert als integer-Wert 1, der integer-Wert 0x12345, die statische oder die frame-relative Adresse ein, die statische oder die frame-relative Adresse von b, und die frame-relative...
  • ...- Adresse des compiler-temp-Wert. In den meisten Systemen in die frühen Tage von C, schieben Sie ein zwei-byte-integer-Wert in einer Variablen gespeichert dauern würde 4 bytes von code und schob eine lange, oft doppelte, aber eine relativ einfache Codierung-Methode könnte den Aufwand zu verringern, drücken eines int auf zwei bytes (oder vielleicht sogar eins), wenn die variable wurde in der Nähe der Spitze des stack-Rahmens an, als würde oft der Fall ist.

Schreibe einen Kommentar