Ler uma constante define em uma lib

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ler uma constante define em uma lib

Mensagem 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 ?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Ler uma constante define em uma lib

Mensagem 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?
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ler uma constante define em uma lib

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ler uma constante define em uma lib

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ler uma constante define em uma lib

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ler uma constante define em uma lib

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ler uma constante define em uma lib

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder