2016-12-15 2 views
2

In Visual Studio 2015, #define USE_SQLDB Direktive nicht, was ich erwarte.
Ich habe ein minimales Beispiel das Problem#define USE_SQLDB (definiert (USE_SQLITE) || definiert (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; 
} 

ich die USE_SQLDB, um wahr zu sein erwarten zu erklären, aber es ist nicht.
Was ist hier falsch?

Antwort

2

das ist einfach nicht gültig Präprozessor Sachen

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

Sie c und preproc mischen. Sie benötigen

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

Es ist nicht definiertes Verhalten: Ref

Wenn der defined Operator als Ergebnis einer Makroerweiterung erscheint, der C-Standard sagt das Verhalten nicht definiert ist.

und von MSDN:

Die defined Direktive kann in einer #if und eine #elif Richtlinie aber nirgendwo sonst verwendet werden.

Verwandte Themen