La tua domanda può essere divisa in due:
1. "? Come posso nascondere funzioni globali"
Un modo semplice per farlo, è NON di mettere l'intestazione della funzione nel file di intestazione:
//============================
// Filename: "mylibrary.hpp"
//============================
// Description:
// Utility functions.
//============================
#ifndef MYLIBRARY_H_INCLUDED
#define MYLIBRARY_H_INCLUDED
//============================
namespace MyLibrary
{
void DoSomething();
} // namespace MyLibrary
//============================
#endif // MYLIBRARY_H_INCLUDED
//============================
file di codice completa:
//============================
// Filename: "mylibrary.cpp"
//============================
// Description:
// Utility functions.
//============================
// self header include
#include "mylibrary.hpp"
//============================
namespace MyLibrary
{
void DoSomethingBefore()
{
// ...
}
void DoSomethingAfter()
{
// ...
}
void DoSomethingConfirmed()
{
// ...
}
void DoSomething()
{
DoSomethingBefore();
DoSomethingConfirmed();
DoSomethingAfter();
}
} // namespace MyLibrary
//============================
#endif // MYLIBRARY_H_INCLUDED
//============================
Quando questo viene compilato , ottieni un file "mylibrary.o" o "mylibrary.obj". Puoi fornirlo ad altri sviluppatori come "mylibrary.hpp" e "mylibrary.obj", ma senza il file "mylibrary.cpp". La maggior parte dei compilatori "plain c"/"C++" può funzionare in questo modo.
Ci sono altri modi, leggere la sezione successiva.
2. "I namespace anonimi sono una buona tecnica per nascondere le funzioni globali?"
La tecnica "Namespace anonimi" è un altro modo per nascondere le funzioni globali.
C'è una domanda simile su:
Unnamed/anonymous namespaces vs. static functions
Ma, personalmente, non mi consiglia di questa tecnica, come la risposta "preferito".
Gli spazi dei nomi sono una di quelle cose che vorrei esistessero dall'inizio di "pure c" o "C++". Ma, "namespace anonimi" o "namespace senza nome", sembra strano da usare.
È come cercare di nascondere qualcosa e, più tardi, dimenticare, dove lo memorizzi.
3 Ulteriori suggerimenti
(a) vi suggerisco di utilizzare un unico principale RICHIESTO, non facoltativo, namespace non anonima per file. Può avere spazi dei nomi interni nidificati aggiuntivi. Ogni spazio dei nomi principale dovrebbe avere lo stesso id. come nome file, ma senza estensione file o suffisso file.
(b) Evitare namespace anonimi. È come immagazzinare cose in un magazzino, senza un indice.
(c) Utilizzare un'estensione di file o prefisso file nei file di intestazione, forse ".h" o ".hpp", anche se è un file C++. Lo standard dice che C++ non dovrebbe usare un'estensione di file o suffisso su file "C++", ma sono difficili da identificare o trovare sul filesystem.
Buona fortuna.
Perché non renderli "statici"? (come in una funzione C statica, non un metodo di classe statico) –
@JamesMcLaughlin: beh in C++ 03 'static' è stato deprecato a tale scopo. Tuttavia, C++ 11 non lo deprezza. Ma 'static' e l'essere nello namespace senza nome significa cose diverse. 'static' gli darà il collegamento interno, quindi la funzione non può essere utilizzata per alcuni scopi. –
Grazie per i vostri suggerimenti. Qualcuna di queste soluzioni, spazio dei nomi statico o non, è consigliata o preferita? – user1192880