Yo creo que hay que pensarse un poco mejor el objetivo y la API correspondiente para eliminar la variable global y luego implementarla en C++, pues es la forma más sencilla de que devuelva objetos globales.
Por ejemplo, lo que has propuesto antes se podría hacer sin variables globales con una función built-in con un argumento opcional con valor por defecto 1, lo cual fuerza a usar el .oza si existe
Set Ois.UseCache(Text fileTOL, Text fileOza [, Real forceUsingOza=1])
Sin embargo, yo creo que es más práctico que el argumento opcional sea un indicador de caducidad pues aporta mayor flexibilidad.
Set Ois.UseCache(Text fileTOL, Text fileOza [, Real caducityInMinutes=1/0])
Si no existe la cache se construye automáticamente sin más contemplaciones. Internamente la función calculará la edad relativa actual como la resta entre la fecha de la caché .oza y el archivo .tol original. Para asegurar la integridad referencial, la caché también deberá ser reconstruida siempre que el fichero original haya sido actualizado dejando obsoleta la caché, o sea, si su edad relativa es negativa. Por lo tanto, no se debe tocar el .tol salvo que realmente se quiera modificar su contenido. Si se altera por error siempre es posible modificar la fecha del archivo .oza mediante el comando touch del sistema operativo para que la edad relativa sea positiva, pero la norma debe ser dejar congelado el archivo de origen. Si la caché está obsoleta la borrará por lo que se tratará como si no hubiese sido creada nunca, es decir se reconstruirá y se recalculará su edad relativa, así que podemos descartar en lo que resta el caso de edad relativa negativa.
Si se le pasa como argumento opcional una caducidad positiva, entonces comprueba si la caché existe; y sólo la reconstruye si ha caducado, es decir, si la edad relativa es positiva y mayor que la caducidad propuesta. El valor por defecto de caducidad infinita indica que el .oza no caduca nunca. Si se le pasa una caducidad nula, negativa o desconocida, se fuerza la reconstrucción de la caché tanto si existía como si no y fuera o no obsoleta. Todo esto permite mucho más control por parte del usuario que un simple flag booleano al mismo tiempo que se asegura la integridad referencial de una forma completamente natural.
Ejemplos:
//Camino general a los archivos .tol de origen
Text tolPath = "./";
//Camino general a los archivos .oza de cache
Text tolPath = Ois.DefRoot+"cache/MyProject/";
Text prefix = "archiveName";
Text fileTol = tolPath + prefix + ".tol";
Text fileOza = cachePath + prefix + ".tol";
//Fuerza la reconstrucción de la caché en cualquiera de estos casos
Set Ois.UseCache(fileTol, fileOza, 0);
Set Ois.UseCache(fileTol, fileOza, -1);
Set Ois.UseCache(fileTol, fileOza, -1/0);
Set Ois.UseCache(fileTol, fileOza, ?);
//No caduca nunca, sólo se construye si no existe o está obsoleta
Set Ois.UseCache(fileTol, fileOza, 1/0);
//Caduca a los 7 días
Set Ois.UseCache(fileTol, fileOza, 60*24*7);
//Caduca a las 2 horas
Set Ois.UseCache(fileTol, fileOza, 60*2);
//Fuerza la reconstrucción de la caché sólo si una variable
//booleana de usuario es cero
Set Ois.UseCache(fileTol, fileOza, If(Alg.SPFRes.LoadFromOza,1/0,0));
//Fuerza la reconstrucción de la caché la primera vez que se
//ejecuta durante el día de cada primer viernes de mes
Set Ois.UseCache(fileTol, fileOza, {
TimeSet firstFridayOfMonth = Succ(Succ(D(1),-1,WD(5)),+1,WD(5));
Real isFirstFridayOfMonth = Belong(Today,firstFridayOfMonth);
Real caducityInMinutes = If(isFirstFridayOfMonth,60*24,60*24*31)
});
//Para casos complejos se puede construir uno su propia casuística
//de reconstrucción usando Case
Set Ois.UseCache(fileTol, fileOza, Case(...));