2009-03-06 3 views
6

Ich habe gerade meine IDE in MS Visual Studio 2005 geändert, die von MSVC++ 6 kommt, und ich habe viele Verwarnungswarnungen bekommen. Anstatt die Warnung zu ignorieren, habe ich begonnen, sie in die Äquivalente zu ändern. Ich fand jedoch heraus, dass es sich um reine Microsoft-Implementierungen handelte.Microsoft_s Funktionen, sind sie jetzt Teil des C++ Standards?

Ich las irgendwo, dass sie drängten, damit diese Teil des Standards werden. Ist es?

Ist es eine gute Idee, diese _s Funktionen zu verwenden? Oder sollte ich etwas anderes benutzen?

Danke.

+2

Ja.Weil Microsoft sich selbst mit dem OOXML-Standard-Debakel bedeckt hat, bin ich sicher, dass ISO sich selbst überfällt, um all ihre Sachen in den C++ - Standard zu integrieren :-) – paxdiablo

+0

Ich kann nicht sagen, ob das Sarkasmus ist oder nicht. :( – krebstar

+0

Mehr Humor als Sarkasmus. Entschuldigungen. Meine Frau würde mit Ihnen übereinstimmen, dass mein Sinn für Humor manchmal seltsam ist. – paxdiablo

Antwort

12

Die *_s() Funktionen sind nicht Teil des C-Standards, aber es gibt einen ausstehenden "Technischen Bericht", der vorschlägt, dass sie hinzugefügt werden (Ich bin mir nicht sicher, ob die Routinen in der TR genau die gleichen wie die von Microsoft sind sind nur ähnlich).

TR 24731-1: Erweiterungen der C-Bibliothek Teil I: Bounds-checking Schnittstellen:

Wenn Sie weitermachen wollen, die alten Funktionen nutzen Sie die deprecation halten Warnungen ruhig durch die Definition des Makros _CRT_SECURE_NO_WARNINGS (war _CRT_SECURE_NO_DEPRECATE, die möglicherweise noch unterstützt wird).

+0

Nur zur Unterstützung, _CRT_SECURE_NO_DEPRECATE funktioniert auf einige wie Strncpy, etc, während für andere wie fopen() Sie müssen #pragma Warnung (deaktivieren: 4996). Angeblich könnten Sie einfach _CRT_SECURE_NO_WARNINGS definieren, aber es funktionierte nicht für mich. – krebstar

+0

Diese '_s' Funktionen sind jetzt Teil von C1X Annex K. – kennytm

+0

Und sie sind sicherlich eine Verbesserung der MS-Schnittstelle, die somit nicht konform ist. Obwohl nicht viel von einer Verbesserung, und ihre Nützlichkeit wird viel diskutiert. – Deduplicator

1

Sie haben Ihre IDE aktualisiert und auch Ihre Microsoft-Bibliotheken aktualisiert. Ehrlich gesagt, können Sie Ihre alten Bibliotheken weiterhin verwenden, wenn sie weiterhin verwendet werden (aus Gründen der Abwärtskompatibilität), obwohl Microsoft gesagt hat, dass sie tatsächlich damit beginnen werden, einige dieser älteren Funktionen zu entfernen. Ich würde sagen, wenn Sie sich vorwärts entwickeln, können Sie die neueren Funktionen verwenden; Wenn Sie sich rückwärts entwickeln (oder sich nicht sorgen, was die Version ist), dann sollten Sie die älteren Funktionen verwenden.

+0

Danke, vielleicht werde ich nur den _CRT_SECURE_NO_WARNINGS Makro verwenden .. – krebstar

1

Wenn Sie auf die Microsoft-Plattform abzielen, verwenden Sie sie auf jeden Fall. Auch wenn dies nicht der Fall ist, können Sie sie immer selbst implementieren, wenn Sie (oder falls) Ihre Software auf eine Nicht-Microsoft-Plattform portieren müssen.

Am schlimmsten ist es, dass Sie am Ende einige wenige #ifdef s verwenden, um bedingt zu kompilieren.

1

Sie werden für die Standardisierung in Betracht gezogen, soweit ich das beurteilen kann. Der Vorschlag lautet TR 24731.

Ob es eine gute Idee ist, sie zu verwenden, würde ich ja sagen. Ich mag die Art, wie sie Fehler entdecken, nicht sehr, aber ich glaube, dass Sie sie mit Ihrem eigenen Handler versehen können. Wenn Sie plattformübergreifende Kompatibilität benötigen, haben Sie zwei Möglichkeiten: Implementieren Sie sie mit Makros auf Nicht-Windows-Plattformen oder deaktivieren Sie die Verwarnungswarnungen.

Nach einer Überprüfung durch eine große Codebasis habe ich festgestellt, dass es fast unmöglich ist, alle Programmierer die C-Standard-Bibliothek Funktionen für die String-Manipulation richtig zu verwenden, so dass alles, was zu korrigieren ist eine willkommene Ergänzung.

+4

Das Problem ist, dass MS den Schritt der einseitigen Einführung der Funktionen machte, als ob sie ein Standard wären, und die "C" -Funktionen, die gleichzeitig im Standard waren, "abwertete". Es scheint mir noch eine andere Möglichkeit, dich dazu zu zwingen, bei ihren Werkzeugen zu bleiben. –

+0

Das ist übermäßig skeptisch. Sie haben eine kleine interne Verbesserung der C-Standard-Bibliotheksfunktionen vorgenommen und diese in ihre öffentlichen Veröffentlichungen gerollt sowie zur Standardisierung eingereicht. Wenn es ein bewusster Trick war, ihren Marktanteil zu erhöhen, warum sollte man es dann standardisieren? –

1

Sie sollten die Standardfunktionen verwenden und alle sadistischen Warnungen deaktivieren, die Microsoft standardmäßig aktiviert hat, um Sie davon abzuhalten, standardkonformen Code zu schreiben. Ich bezweifle ernsthaft, dass die "_s-Funktionen" jemals dem Standard C hinzugefügt werden (obwohl sie vorgeschlagen wurden), da sie eine Erfindung eines einzelnen Anbieters sind und niemals von irgendeinem anderen Anbieter implementiert wurden. (Hey, lass uns alle POSIX in den C-Standard integrieren, während wir gerade dabei sind ...)

Verwandte Themen