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

时间:2016-12-15 18:08:02

标签: c++ c visual-studio

在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是真的,但事实并非如此 这有什么不对?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

这是未定义的行为:Ref

  

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

MSDN

  

defined指令可用于#if#elif指令,   但没有其他地方。