Compiler errors 如何对#ifdef编译指令中的预处理器条件使用逻辑运算符?
我有以下使用预处理器的代码: 由于以下错误,无法编译: test.mq4(3,12):错误175:“Compiler errors 如何对#ifdef编译指令中的预处理器条件使用逻辑运算符?,compiler-errors,syntax-error,conditional,preprocessor-directive,mql4,Compiler Errors,Syntax Error,Conditional,Preprocessor Directive,Mql4,我有以下使用预处理器的代码: 由于以下错误,无法编译: test.mq4(3,12):错误175:“|”-不允许在全局作用域上使用表达式 但是,当第一行(foo)被注释掉时,代码可以很好地编译,在这种情况下(当没有定义foo时),编译器似乎允许在全局范围内使用此表达式 您可以尝试使用(在Linux下使用wine)编译上述代码: 因此,问题是: 为什么这不起作用和如何正确定义上述预处理器条件(foo | | | bar) 我还尝试了以下语法: #if defined (foo) || defin
|
”-不允许在全局作用域上使用表达式
但是,当第一行(foo)被注释掉时,代码可以很好地编译,在这种情况下(当没有定义foo时),编译器似乎允许在全局范围内使用此表达式
您可以尝试使用(在Linux下使用wine
)编译上述代码:
因此,问题是:
为什么这不起作用和
如何正确定义上述预处理器条件(
foo | | | bar
)我还尝试了以下语法:
#if defined (foo) || defined (!bar)
正如()前面所建议的,但它失败并出现以下错误:
错误109:“#if
”-预处理器命令无效
错误149:“#else
”-意外标记
这是因为MQL语法完全不同,它不支持这些类型的预处理器命令。为什么这不起作用?
因为条件语法不符合MQL4预处理器的规范
(相反,我再次检查并交叉检查了
MQL4文档
部分:
[MQL4
参考/语言基础/预处理器/条件编译(\ifdef
,\ifndef
,\else
,\endif
))
预处理器条件编译指令允许编译或跳过程序的一部分,具体取决于某个条件的实现情况
该条件可以采取以下形式之一。
标识符
// ... 这里的代码是编译的
//。。。如果已在define指令中为预处理器定义了标识符,则
// ... 此处的代码已编译
/。。。如果标识符
不是当前由预处理器#define指令定义的
#endif
在这个MQL4预处理器上下文中,条件是一组静态、封闭的公认语法指令构造函数的成员
在这个MQL4预处理器上下文中,标识符是常量项,而不是表达式
Q.E.D.
正确的方法?
仍然可以选择“手动”构造缺少的逻辑灵活性:
你想用#ifdef foo | |做什么!条形码?这不像foo | |!条形码可以有一个与之关联的预处理定义。您是否尝试测试“foo已定义或bar未定义”@user2357112是,以避免重复4种不同可能性的不必要嵌套条件。当条件未涵盖时,编译器会抱怨它没有定义,如果它以前定义过,它会抱怨它已经定义。@kenorb值得一提的是,“new”-MQL4
编译器是MetaLang.exe
(在WINE
包装器内的自动LiveUpdate修订可能有问题)因此,与gcc
工具链的任何部分都无关。因此,包括文档规则z。欢迎来到MQL4
moving sands的世界。(如果有兴趣花一些时间在不断的“*slide”MetaLang.exe
“new-MQL4
”语法规则:o)
)@user3666197我认为MetaLang.exe
(在build 600之前)是旧的编译器,它本身不再随平台一起提供(正如我所解释的),所以我使用的是mql.exe
,它在wine
下运行得非常好。如果你认为它不是新的,你可以从哪里得到最新的?我认为它是最新的,因为它上面写着:2015年7月2日
。我知道它很相似,与gcc
没有任何关系,但是之前的答案(现在删除)我试图回答它,所以我做了一些额外的澄清,以避免任何进一步的尝试或混淆。@user3666197这是编译器的版本,所以我认为它们的版本不同,并且支持最新的语法(顺便说一句,从未使用[F1],通常检查在线文档)编译器和终端在wine-1.6和1.7下工作。顺便说一句,我实际上在wine下完成了全部工作,因此您可以在随时可用的Vagrant VM中测试终端。
mql.exe /mql4 test.mq4
#if defined (foo) || defined (!bar)
#ifdef bar_identifier
#ifndef foo_indentifier
extern bool aCompileTimePresetDefaultToExposedEXTERN_USER_INPUT = True;
#else
extern bool aCompileTimePresetDefaultToExposedEXTERN_USER_INPUT = False;
#endif
#else
extern bool aCompileTimePresetDefaultToExposedEXTERN_USER_INPUT = False;
#endif