Что нового

Au3Stripper и препроцессор Си (mcpp)

Spray

Новичок
Сообщения
17
Репутация
2
Безуспешно пытаюсь прикрутить препроцессор Си (mcpp) к компилятору AutoIt (AutoIt3Wrapper).

По отдельности препроцессор худо-бедно работает. Например, такой код

Код:
#define ASDF "asdf"
#define ZXCV "zxcv"

#ifdef QWER
ConsoleWrite (ASDF)
#endif

#define QWER

#ifdef QWER
ConsoleWrite (ZXCV)
#endif

превращается в такой

Код:
ConsoleWrite ("zxcv")


Директиву #include mcpp тоже понимает, однако он игнорирует директиву #include-once, воспринимая её как ошибочную. Таким образом использовать препроцессор перед Au3Stripper проблематично.

Попробовал вызвать mcpp после стриппера, чтобы все #include, включая #include-once, были уже обработаны, но тут возникает новая беда: Au3Stripper удаляет все директивы, предназначенные для препроцессора. Можно, конечно, обрамить их #Au3Stripper_Off и #Au3Stripper_On, но получается очень громоздко:

Код:
#include <Array.au3>

#Au3Stripper_Off
#define ASDF "asdf"
#Au3Stripper_On

$myVariable = ASDF

#Au3Stripper_Off
#ifdef ASDF
#Au3Stripper_On

$myVariable &= "qwer"

#Au3Stripper_Off
#endif
#Au3Stripper_On

Можно ли как-то решить эту проблему? Например, сделать так, чтобы mcpp воспринимал все #include-once как «сишные» #pragma once, или чтобы стриппер не удалял незнакомые ему директивы.

P. S. jEdit4AutoIt — крутой препроцессор для AutoIt, но он, как я понял, может работать только в составе jEdit.
Код:
; File ............: __NAME__
; AutoItVersion ...: __AUTOIT_VERSION__
; Time ............: __TIME__
; Date ............: __DATE__

#define Text "foo bar"
#define Var1 $ok[$i]
#define Var2 $test
#define Beta

~$b[$i]
$a %= $b
$a <<= $v[$i]
$a >>= $v

#ifdef Beta
        #include <test_beta.au3>
#else
        #include <test.au3>
#endif


Var1 = ( 1 > $a ? "ok" : Text )

For $i : $aArray
        MsgBox(64,"",$aArray[$i])
Next

#undef Var2

#ifdef Var2
        MsgBox(64,"","1")
#elif Test
        MsgBox(64,"",Var2)
#elif Var1
        MsgBox(64,"",Text)
#else
        MsgBox(64,"","3")
#endif


Код:
; File ............: pp_test.au3
; AutoItVersion ...: v3.3.0.0
; Time ............: 20:20:35
; Date ............: Mi Mai 2009

BitNOT($b[$i])
$a = Mod($a, $b)
$a = BitShift($a, $v[$i])
$a = BitShift($a, -($v))

#include <test_beta.au3>

If 1 > $a Then
        $ok[$i] = "ok"
Else
        $ok[$i] = "foo bar"
EndIf

For $i = 0 To UBound($aArray) -1
        MsgBox(64, "", $aArray[$i])
Next

MsgBox(64, "", "foo bar")
 
Верх