Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler errors 如何对#ifdef编译指令中的预处理器条件使用逻辑运算符?_Compiler Errors_Syntax Error_Conditional_Preprocessor Directive_Mql4 - Fatal编程技术网

Compiler errors 如何对#ifdef编译指令中的预处理器条件使用逻辑运算符?

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

我有以下使用预处理器的代码:

由于以下错误,无法编译:

test.mq4(3,12):错误175:“
|
”-不允许在全局作用域上使用表达式

但是,当第一行(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