I programa de pequeñas micro-controladores en C++, que consigue exactamente lo que quiere.
Lo que usted llama un módulo es una clase de C++, que puede contener datos (ya sea externamente accesible o no) y funciones (del mismo modo). El constructor (de una función dedicada) initilializes. El constructor puede tomar parámetros de tiempo de ejecución o (mi favorito) en tiempo de compilación (plantilla) de los parámetros. Las funciones dentro de la clase implícitamente obtener la variable de clase como primer parámetro. (O, a menudo, mi preferencia, la clase puede actuar como un oculto singleton, por lo que todos los datos se accede sin esta sobrecarga).
El objeto de la clase puede ser global (así que usted sabe que en el enlace-momento en el que todo se ajuste a), o en la pila local, presumiblemente en el principal. (No me gusta C++ globales debido a la indefinidos global de inicialización de la orden, así que prefiero pila-local).
Mi preferido el estilo de programación es que los módulos son las clases estáticas, y de su (estática) de configuración es por los parámetros de la plantilla. Esto evita que casi todos los overhad y permite la optimización. Combine esto con una herramienta que calcula el tamaño de la pila y se puede dormir sin preocupaciones :)
Mi charla sobre esta forma de codificación en C++: Objetos? No, Gracias!
Un montón de embedded / microcontrolador programadores parecen no gustar de C++ porque piensan que eso les obligaría a utilizar todos los de C++. Que no es absolutamente necesario, y sería una muy mala idea. (Probablemente no la uso todos los de C, ya sea! Creo montón, de punto flotante, setjmp/longjmp, printf, ...)
En un comentario de Adam Haun menciona RAII y la inicialización. OMI RAII tiene más que ver con la deconstrucción, pero su punto es válido: objetos globales se construirá antes de su principal comienza, por lo que podrían trabajar en supuestos no válidos (como una de las principales la velocidad de reloj que va a ser cambiado lateron). Que es una razón más por la que NO utiliza código mundial-inicializa los objetos. (Yo uso un linker script que va a fallar cuando he global de código inicializa los objetos.) OMI tales "objetos" debe ser creado explícitamente y se pasa alrededor. Esto incluye un 'espera' instalación 'objeto' que proporciona un wait() función. En mi configuración esta es "objeto", que establece que la velocidad de reloj del chip.
Hablando de RAII: que es uno más de C++ característica que es muy útil en pequeños sistemas embebidos, aunque no por la razón (la desasignación de memoria) se utilizan más que en largere sistemas (pequeños sistemas embebidos en su mayoría no utilizan desasignación de memoria dinámica). Pensar en un recurso de bloqueo: puede hacer que el recurso bloqueado un objeto contenedor, y restringir el acceso a los recursos a ser posible sólo a través del bloqueo de contenedor. Cuando el contenedor se va fuera de alcance, el recurso está desbloqueado. Esto impide el acceso sin bloqueo, y hace que sea mucho más probable que olvidemos el desbloqueo. con algunos (plantilla) la magia puede ser cero sobrecarga.
Si realmente debe ser C....
Usted podría utilizar la macro engaño: declarar su stucts públicamente, por lo que tienen un tipo y pueden ser asignados a nivel mundial, pero destrozar los nombres de sus componentes, más allá de la usabilidad, a menos que algún macro se define de forma diferente, que es el caso en el módulo .c archivo. Para mayor seguridad se podría utilizar el tiempo de compilación en el destrozarlo.
O tienen una versión pública de su estructura que no tiene nada útil en ella, y tienen la versión privada (con datos útil) sólo en su .c archivo, y afirman que ellos son del mismo tamaño. Un poco de archivo engaño podría automatizar este proceso.
@Lundins comentario sobre el mal (embedded) los programadores:
El tipo de programador que describir probablemente iba a hacer un lío en cualquier idioma. Macro (presente en C y C++) son una manera obvia.
Utillaje puede ayudar hasta cierto punto. Para mis estudiantes me mandato incorporado un script que especifica sin excepciones, no-rtti, y da un error del vinculador cuando el montón se utiliza o código inicializa variables globales están presentes. Y especifica advertencia=error y permite que casi todas las advertencias.
Animo con el uso de plantillas, pero con constexpr y conceptos metaprogramación es menos necesario.
"confundido Arduino programadores" me gustaría mucho para reemplazar el Arduino (cableado, replicación de código en las bibliotecas) estilo de programación con C++ moderno, que puede ser easiere, más seguro, y producir más rápido y más pequeño código. Si sólo tuviera el tiempo y el poder....