0

我有以下使用预处理器条件编译指令的代码:

#define foo
#define bar

#ifdef foo || !bar
  extern bool Verbose = FALSE;
#else
  extern bool Verbose = TRUE;
#endif

void start() {
}

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

test.mq4(3,12) : 错误 175: ' ||' - 全局范围内不允许表达式

但是,当第一行(foo)被注释掉时,代码编译得很好,这似乎编译器在这种情况下允许这个表达式在全局范围内(当foo未定义时)。

您可以尝试使用mql编译器编译上述代码(在 Linux 下使用wine):

mql.exe /mql4 test.mq4

所以问题是:

为什么这不起作用
以及
如何foo || !bar
以适当的方式定义上述预处理器条件( ) ?


我还尝试了以下语法:

#if defined (foo) || defined (!bar)

正如user2357112GNU cpp 语法)之前所建议的那样,但它失败并出现以下错误:

错误 109:“ #if”- 无效的预处理器命令

错误 149:“ #else”- 意外令牌

这是因为 MQL 语法完全不同,它不支持这些类型的预处理器命令。

4

1 回答 1

3

为什么这不起作用?

因为条件语法不符合 MQL4preprocessor 的
规范。(而是再次检查并交叉检查了以下部分:[参考/语言基础/预处理器/条件编译、、、、]
MQL4 Documentation

MQL4#ifdef#ifndef#else#endif


预处理器条件编译指令允许根据特定条件的满足来编译或跳过程序的一部分。

条件 can采用以下形式之一。 // ... 此处的代码已编译 // ... 如果已在#define 指令中为预处理器定义。 // ... 此处的代码已编译// ... 如果预处理器#define 指令当前未定义

#ifdef identifier

identifier
#endif

#ifndef identifier

identifier
#endif

在此 MQL4 预处理器上下文中, Acondition是一组已识别的静态、封闭句法指令构造函数的成员{ #ifdef | #ifndef | #else }

identifier在这个 MQL4 预处理器上下文中,An是一个常量term而不是一个表达式。

Q.E.D.


正确的方法?

仍然可以选择“手动”构建缺少的逻辑灵活性:

#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
于 2015-10-10T10:26:29.930 回答