#define USE_SQLDB (定义(USE_SQLITE) || 定义(USE_MYSQL))
Posted
技术标签:
【中文标题】#define USE_SQLDB (定义(USE_SQLITE) || 定义(USE_MYSQL))【英文标题】:#define USE_SQLDB (defined(USE_SQLITE) || defined(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
是真的,但事实并非如此。
这里有什么问题?
【问题讨论】:
【参考方案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
指令, 但别无他处。
【讨论】:
以上是关于#define USE_SQLDB (定义(USE_SQLITE) || 定义(USE_MYSQL))的主要内容,如果未能解决你的问题,请参考以下文章
扩展 eslint-config-react-app 时 no-use-before-define 无效