2016-12-15 53 views
2

在Visual Studio 2015中,#define USE_SQLDB指令並沒有達到我的預期。
我有一個最小的例子來說明這個問題#define USE_SQLDB(defined(USE_SQLITE)|| defined(USE_MYSQL))

#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

這根本就不是有效的預處理東西

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

你混合C和preproc。您需要

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

它是未定義的行爲:Ref

如果操作者defined顯示爲宏擴展的結果, C標準說的行爲是未定義。

MSDN

defined指令可以在#if中使用和#elif指令, 但無處。