La siguiente es bastante típico ...
third-party library
release
obj
debug
obj
include
src
sublib 1
sublib 2
mylibrary
release
obj
debug
obj
include
src
sublib 1
sublib 2
myapp
release
obj
debug
obj
subapp 1
subapp 2
mylittleapp
release
obj
debug
obj
Básicamente, subcarpetas para subproyectos es común para proyectos más grandes, pero sobre todo un proyecto particular tiene carpetas para src, etc. incluyen una carpeta para cada configuración de generación es común, y mantener los archivos obj y otros intermedios en una subcarpeta de eso es una buena idea. Puede ser tentador colocar carpetas de subproyecto en carpetas obj, pero generalmente eso es innecesario: las carpetas obj no necesitan estar bien organizadas, por lo que la única preocupación es un conflicto de nombre de archivo, y la mejor solución para eso es tener nombres únicos de archivos de origen. dentro (al menos) de cada proyecto.
Las carpetas "incluir" deben IMO contener encabezados que serán #incluidos por otros proyectos - los encabezados internos pertenecen a la carpeta "src".
Poner cosas de UI en una carpeta separada no es una mala idea, si es lo suficientemente grande. He visto cosas de la interfaz de usuario hechas como un proyecto independiente de nivel superior vinculado a la estática, y me refiero a aplicaciones específicas aquí, no (por ejemplo) wxWidgets. Por lo general, sin embargo, ese nivel de división es el subproyecto si vale la pena separarlo. La forma de dividir los subproyectos es más una cuestión de bloques específicos de la aplicación en general, por lo que depende de si las cosas de la interfaz de usuario se manejan mejor como un bloque separado o como fragmentos separados combinados con la lógica específica de la tarea.
Los espacios de nombre no son la característica de idioma más utilizada, posiblemente porque muchas personas usan tanto el "uso" que no hacen mucha diferencia. Un espacio de nombres para un proyecto de biblioteca principal tiene sentido, pero la asociación de subcarpetas a espacios de nombres 1: 1 no es algo que haya visto. Personalmente, tengo un espacio de nombres que abarca la mayor parte de mi código de biblioteca, con un par de espacios de nombres secundarios para cosas que rara vez se usan en general, pero que se usan mucho en algunos lugares (por ejemplo, espacios de nombres "bit a bit"). Los espacios de nombres secundarios están limitados a pares de fuente/encabezado únicos, por lo que no es necesario que aparezcan subcarpetas. La mayor parte de la selección específica de la biblioteca se hace incluyendo el encabezado correcto, excepto que normalmente incluyo el lote a través del encabezado de nivel superior del proyecto principal.
Básicamente, los espacios de nombres son una forma de evitar conflictos de nombres. No se asocian necesariamente con abstracciones o bloques funcionales ni nada. Dentro de un proyecto en particular, probablemente sea mejor que se asegure de que los nombres no entren en conflicto. Al igual que con el espacio de nombres "std", está bien poner un lote de cosas en un espacio de nombre.
Como dices, sin embargo, esta no es una respuesta definitiva; por supuesto, hay variaciones menores y enfoques bastante diferentes.
¿Qué tipo de entorno está utilizando? – ihtkwot
Dónde colocar la salida de un programa es una cuestión bastante diferente y probablemente sea mejor hacerla como una pregunta separada. –
@gf buen punto. lo editó. – Stephano