【问题标题】:#define USE_SQLDB (defined(USE_SQLITE) || defined(USE_MYSQL))#define USE_SQLDB (定义(USE_SQLITE) || 定义(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 是真的,但事实并非如此。
这里有什么问题?

【问题讨论】:

    标签: c++ c visual-studio


    【解决方案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 指令, 但别无他处。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 2015-09-29
        • 1970-01-01
        • 1970-01-01
        • 2015-07-06
        相关资源
        最近更新 更多