Angenommen, ich entwickle eine typische Mac- oder iOS-Anwendung mit den neuesten Xcode-Tools von Apple. Des Weiteren gehe ich davon aus, dass ich diese Anwendung hauptsächlich mit Objective-C entwickle und alle relevanten APIs von Cocoa oder Cocoa Touch von Apple nutze.
Nehmen wir an, ich habe derzeit keine Pläne, C ++ oder Objective-C ++ in meiner Codebasis zu verwenden, aber ich vermute, dass ich etwas in der Zukunft ein wenig streuen möchte Objective-C ++ hier und dort.
Also überlege ich, alle meine .m
-Dateien stattdessen als .mm
zu benennen, nur für den Fall. (Dies hat den erwünschten Effekt einer saubereren Historie in meinem SCM-System, da ich Dateien später nicht umbenennen muss.)
Ist das eine schlechte Idee? Gibt es einen Grund, warum die Verwendung von .mm
-Dateien definitiv oder signifikant schlechter ist als die Verwendung von .m
, wenn die Datei tatsächlich kein Objective-C ++ enthält?
Vermutlich drückt diese Dateierweiterung einige Schalter im Compiler, die dann den Quellcode nicht nur für ObjC, sondern auch für C ++ analysieren müssen. Hat dies einen signifikanten negativen Einfluss auf die Build-Zeiten für mittlere bis große Codebasen?
Hat es irgendwelche anderen negativen (oder positiven) Auswirkungen, die ich beachten sollte?
HINWEIS: Bitte antworten Sie nicht mit irgendwelchen Kommentaren darüber, ob ObjC oder C ++ besser ist. Darum geht es in dieser Frage nicht.
Es ist nicht die schlechteste Idee, aber es ist auch nicht wirklich eine gute Idee.
Der Hauptzweck von Objective-C ++ besteht darin, als Brücke für Objective-C-Code zu fungieren, der eine C ++ - Bibliothek verwenden muss. Daher ist in den meisten Projekten fast der gesamte Code ein einfaches altes Objective-C, mit vielleicht einigen .mm-Dateien, um ein "Wrapper" -Objekt zu erstellen, um mit der C ++ - Bibliothek zu kommunizieren.
Daher ist es äußerst unwahrscheinlich, dass Sie wesentliche Teile Ihres Codes von Objective-C nach Objective-C ++ ändern müssen. Sie sollten in Ihrem SCM-Verlauf nicht viele Umbenennungen haben.
Das Hauptproblem bei der Verwendung von Objective-C ++ ist, dass Sie "den weniger befahrenen Weg" verfolgen: 99% der von Ihnen gelesenen Tutorials und Open-Source-Codes, die Sie verwenden und von denen Sie lernen, werden von Ihnen kompiliert der Obj-C-Compiler. Die Verwendung des Obj-C ++ - Compilers wird größtenteils gleich sein und wird wahrscheinlich die meiste Zeit keinen Unterschied machen, aber Sie werden schließlich auf ein Problem stoßen, das darauf zurückzuführen ist, dass Obj-C ++ etwas anders kompiliert wurde, aber wenn Sie das finden Fehler wird es nicht offensichtlich sein, und Sie werden eine Menge Zeit damit verbringen, es zu diagnostizieren, bevor Sie erkennen, dass es ist, weil Sie eine weniger gut getestete Compiler-Setup verwenden.
Wenn Sie viele C ++ - Erfahrungen haben und feststellen, dass Sie Features aus C ++ in Ihrem Code "brauchen", brauchen Sie sie wahrscheinlich nicht wirklich. Sie müssen wahrscheinlich ein wenig mehr Zeit damit verbringen, herauszufinden, wie Sie das Äquivalent machen Ziel c. Wenn Sie in Rom sind, machen Sie es wie die Römer.
Im Allgemeinen ist "nur für den Fall" kein guter Grund, von der üblichen Praxis abzuweichen. Sie werden oft viel Mühe auf etwas verwenden, das Sie nicht brauchen werden.
Wie ich in einem Kommentar geschrieben habe, ist C ++ keine strenge Obermenge von C, also ist es möglich, dass Sie in Fälle geraten, in denen Sie z. C99-Code, der nicht kompiliert wird, wenn Sie ihn in eine Objective-C ++ - Datei schreiben. Ich hatte dieses Problem kürzlich mit C99 zusammengesetzten Literalen .
Zitat von Barry Wark:
Der Hauptnachteil bei der Verwendung von .mm über .m für "normales" Objective-C ist, dass die Kompilierzeiten für Objective-C ++ wesentlich höher sind. Dies ist, weil der C ++ - Compiler länger dauert als der C-Compiler. Mit Xcode 3.2 und höher, Objective-C-Code kann das Clang-Frontend-Tool verwenden um die Objective-C / C-Kompilierungszeiten erheblich zu beschleunigen. Schon seit Clang unterstützt Objective-C ++ / C ++ noch nicht, dies erweitert die Lücke in der Zusammenstellung der Zeiten zwischen den beiden.
ABER
UPDATE Feb 17, 2012 Ab Xcode 4.0 (mit LLVM 3.0) hat Clang unterstützte Objective-C ++. Sogar C ++ 11-Unterstützung ist jetzt ziemlich stark.
Ich denke also, dass es ok ist, .mm zu verwenden, solange Sie nur C-Funktionen verwenden. .mm-Dateien sollten Code generieren, der sehr ähnlich zu .m
istJa, es ist eine schlechte Idee.
Wenn ich eine .mm
-Datei sehe, erwarte ich, dass sie C ++ - Code hat (natürlich neben Objective-C). Es gibt ein paar Dinge, die nicht direkt mit OOP zu tun haben, die in C ++ im Vergleich zu C etwas anders sind.
Benennen Sie also alle Ihre Objective-C-Dateien als .m
. Sobald Sie irgendwelche C ++ - Funktionen benötigen, benennen Sie sie in .mm
um und stellen Sie sicher, dass alles funktioniert.
Sie erhalten Bonuspunkte, wenn Sie Ihre Header-Dateien C ++ - weniger behalten.
Aus meiner Erfahrung (bei Apple): 1) das xcode-Team denkt über C ++ als letztes (dauerte ewig, um Blöcke in objc ++ zu unterstützen) 2) objc ++ ist viel langsamer beim Kompilieren von
Tags und Links objective-c objective-c++