Página 1 de 1

Ler uma constante define em uma lib

Enviado: 05 Mar 2017 17:12
por asimoes
Pessoal,

Existe alguma forma de ler a constante "teste" abaixo passada para a compilação com a diretiva -dteste em uma lib linkada com programa teste ?

ex. hbmk2 teste.hbp -dteste (no hbp tem a referência para a lib teste)

Na lib teste existe algum recurso do harbour para poder ler o define teste ? tem como ?

Ler uma constante define em uma lib

Enviado: 05 Mar 2017 17:13
por fladimir
Não é automático?

Tipo eu tenho uma lib q nela tem se a Diretiva Tal esta ativa age de tal forma

Ai compilo o projeto principal com -DDIRETIVA e linko a lib e funciona...

Ou seria outra dúvida?

Ler uma constante define em uma lib

Enviado: 05 Mar 2017 18:19
por asimoes
Fladimir

Nos meus testes a diretiva na compilação do executável não é passada para a lib, a lib não "enxerga" essa diretiva.

Ex.:

Criação da lib teste

Código: Selecionar todos

FUNCTION LERDIRETIVA
   cValor :=""
   #ifdef TESTE
      cValor := "DIRETIVA TESTE"
   #endif
RETURN cValor
Criação do executável usando a lib teste usando a função LERDIRETIVA da lib

Código: Selecionar todos

FUNCTION MAIN()
   ALERT(  LERDIRETIVA() ) // RETORNA "" PORQUE A LIB não vê a diretiva TESTE usada na compilação do executável.
RETURN Nil
compilação hbmk2 prog.hbp -dTESTE

O que eu quero saber se existe alguma forma da lib "ver" essa diretiva

Ler uma constante define em uma lib

Enviado: 05 Mar 2017 18:59
por JoséQuintas
Xi.... acho que viajou na maionese.... rs

#define é em tempo de compilação, para o pré-compilador.
Se a LIB está gerada, essa fase já foi.

O que pode fazer é na LIB criar alguma forma de configurar o que quer, em run-time.

Ler uma constante define em uma lib

Enviado: 05 Mar 2017 20:32
por asimoes
Quintas
O que pode fazer é na LIB criar alguma forma de configurar o que quer, em run-time.
É isso que queria saber se tem como pegar o valor do define, usando Eval() ou alguma função especial

O interessante é que você usa A + B para gerar C, onde A seu programa e B a lib geram o executável, neste detalhe a lib não tem a mão de 2 vias

Ler uma constante define em uma lib

Enviado: 05 Mar 2017 21:35
por JoséQuintas
Lógico que tem, é só criar, por exemplo igual uso em multithread..

Código: Selecionar todos

FUNCTION SetLibSetup( xValue )
   STATIC nSetup := 0
   IF xValue != NIL
      nSetup := xValue
   ENDIF
   RETURN nSetup
Na hora de usar:

Código: Selecionar todos

SetLibSetup( 10 )
? SetLibSetup()
Então bastaria ter essa funcão na LIB, e a LIB usar o retorno dessa função.
O aplicativo poderia alterar o conteúdo.
Se vai usar array, classe, etc. pra ter mais parâmetros, aí fica a seu critério.

Ler uma constante define em uma lib

Enviado: 05 Mar 2017 21:56
por asimoes
Quintas

Gostei da sua solução,

Mas ainda preciso usar o defined porque temos 2 situações de compilação -dPROD e -dHOMOLOG, não temos uma lib para cada ambiente

PROD = PRODUÇÃO
HOMOLOG = HOMOLOGAÇÃO

Código: Selecionar todos

FUNCTION MAIN
   PRIVATE tDiretiva := ""
   #if defined( PROD )
      tDiretiva := "PROD"
   #elif defined( HOMOLOG )
      tDiretiva := "HOMOLOG"
   #endif
   Alert( LERDIRETIVA() )
RETURN Nil

Na lib:

FUNCTION LERDIRETIVA

   cValor :=""

   IF Type("tDiretiva") != "U" .AND. tDiretiva == "HOMOLOG"
      cValor := "DIRETIVA " + tDiretiva
   ENDIF

RETURN cValor