#define USE_SQLDB (定义(USE_SQLITE) || 定义(USE_MYSQL))

Posted

技术标签:

【中文标题】#define USE_SQLDB (定义(USE_SQLITE) || 定义(USE_MYSQL))【英文标题】:#define USE_SQLDB (defined(USE_SQLITE) || defined(USE_MYSQL)) 【发布时间】:2016-12-15 18:08:01 【问题描述】:

在 Visual Studio 2015 中,#define USE_SQLDB 指令不符合我的预期。 我有一个最小的例子来解释这个问题

#include "stdafx.h"

#define USE_SQLITE
//#define USE_mysql

#define USE_SQLDB (defined(USE_SQLITE) || defined(USE_MYSQL))

int main()

#if defined(USE_SQLITE)
    puts("SQLITE");             // OK
#endif

#if defined(USE_MYSQL)
    puts("MYSQL");              // Grayed out - OK
#endif

// Should expand to defined(USE_SQLITE) || defined(USE_MYSQL)
#if USE_SQLDB
    puts("SQLITE or MYSQL");    // Grayed out - NOT OK
#endif

#if defined(USE_SQLITE) || defined(USE_MYSQL)
    puts("SQLITE or MYSQL");    // OK
#endif

    return 0;

我希望USE_SQLDB 是真的,但事实并非如此。 这里有什么问题?

【问题讨论】:

【参考方案1】:

这根本不是有效的预处理器东西

#define USE_SQLDB (defined(USE_SQLITE) || defined(USE_MYSQL))

您正在混合 c 和 preproc。你需要

#if defined(USE_SQLITE) || defined(USE_MYSQL)
#define USE_SQLDB
#endif

【讨论】:

【参考方案2】:

这是未定义的行为:Ref

如果defined 运算符作为宏扩展的结果出现,则 C 标准表示行为未定义。

来自MSDN:

defined 指令可用于#if#elif 指令, 但别无他处。

【讨论】:

以上是关于#define USE_SQLDB (定义(USE_SQLITE) || 定义(USE_MYSQL))的主要内容,如果未能解决你的问题,请参考以下文章

“M_PI_2”: 重复定义的宏

如何将 #defines 从 C++ 共享库导出到应用程序

扩展 eslint-config-react-app 时 no-use-before-define 无效

fedora26 编译内核出现Can't use 'defined(@array)' 错误

layUI

如何将DEFINE变量设置为等于PL / SQL中另一个已定义表的选择