2016-12-15 15 views
2

Visual Studio 2015では、#define USE_SQLDBディレクティブは私が期待することをしません。
私が問題に#define USE_SQLDB(定義済み(USE_SQLITE)||定義済み(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ディレクティブ、 が、どこもに使用することができます。

関連する問題