2017-04-04 2 views
0

Ich habe zwei C-Projekte unter Visual Studio 2015 vorbereitet. Das erste Projekt ist einfach ein statisches Bibliotheksprojekt, während das zweite eine Konsolenanwendung ist, die die statische Bibliotheksdatei des ersten Projekts verwendet.verifizierte generierte Bibliothek für die Kapselung

Ich überprüfte die statische Bibliotheksdatei mit DUMPBIN-Tool in Windows und sah, dass es viele Variablen und Funktionen gibt, die nach außen ausgesetzt sind, was für die Einkapselungsprobleme sehr schlecht ist.

Meine Frage ist, wie kann ich sicher sein, dass ich die Funktionen, die privat sein sollen nicht offen legen. Muss ich jedes Mal mit diesem Tool überprüfen? Meine Frage deckt auch die Variablen ab. Alle meine statischen globalen Variablen sind auch nach außen ausgesetzt. Wie kann ich sie zwingen, privat zu sein?

+0

Namen mit interner Verknüpfung sollten per Definition nicht nach außen verfügbar sein. Wenn Ihre Bibliothek aus mehreren Kompilierungseinheiten besteht, geben Sie die internen Deklarationen einfach nicht an. – Olaf

Antwort

1

Ich glaube nicht, dass Präsenz in Dumpbin-Ausgabe kann als eine "Belichtung" betrachtet werden. Alle Ihre statischen globalen Variablen erfordern eine gewisse Speicherplatzzuweisung und wahrscheinlich eine Initialisierung zur Laufzeit. Daher ist es nur natürlich, dass sie in der Dumpbin-Ausgabe präsent sind. Auch wenn Sie mit Link-Time-Code-Generierung kompilieren, dann ist alles tatsächlich "ausgesetzt".

+0

Ah, sehr nützliche Informationen. Also, wie kann ich verstehen, welche Funktionen ausgesetzt sind und welche nicht? – sanchop22

+2

Der richtige Weg, um eine "öffentliche Schnittstelle" in C zur Verfügung zu stellen, ist eine Header-Datei zu schreiben, die Deklarationen für alle öffentlich verfügbaren Sachen enthält und hoffe, dass Benutzer dieser Header-Datei nicht versuchen werden, tiefer zu gehen und einige interne Dinge zu verbinden ausversehen). Zum Beispiel, wenn Sie eine nicht-statische globale Variable int foo haben, dann kann jemand es tatsächlich in seiner eigenen ".c" Datei als extern int foo redeclare und ändern. Und das Gleiche gilt für Funktionen. Wann immer es möglich ist, sollten interne Dinge als statisch deklariert werden, da alles andere von außen zugänglich ist. – dodo951

Verwandte Themen