【问题标题】:C macros work different for gcc and MS Visual StudioC 宏对 gcc 和 MS Visual Studio 的工作方式不同
【发布时间】:2017-10-08 22:36:37
【问题描述】:

纯C,部分代码来自here

#define _CAT(a, ...) a ## __VA_ARGS__
#define SWITCH_ENABLED_0     0
#define SWITCH_ENABLED_1     1
#define SWITCH_ENABLED_      1
#define ENABLED(b) _CAT(SWITCH_ENABLED_, b)

// problem in this string if SOMETHING is not defined    
#if ENABLED(SOMETHING) 
int tmp;
#endif

此代码适用于 gcc,但在 MS Visual Studio 2010 中,它为 VS 2017 提供“错误 C2059:语法错误:'数字后缀错误'”和“致命错误 C1017 - 无效的整数常量表达式”。

如何修改代码使其适用于 gcc 和 VS?

如果不可能,VS 的模拟代码怎么办?类似的东西

 #define ENABLED(X) #if defined(X) && #if X

【问题讨论】:

  • 你应该指定错误对应的行号
  • #if ENABLED(SOMETHING) 行中的错误 // 问题
  • 你需要无后缀的SWITCH_ENABLED_宏吗?
  • C99 引入了可变参数宏,AFAIK VS 2010 不支持大多数 C99 功能。
  • visual-studio-2017 标签是干什么用的?

标签: c visual-studio-2010 gcc visual-studio-2017 c-preprocessor


【解决方案1】:

鉴于此:

#define _CAT(a, ...) a ## __VA_ARGS__
#define SWITCH_ENABLED_false 0
#define SWITCH_ENABLED_true  1
#define SWITCH_ENABLED_0     0
#define SWITCH_ENABLED_1     1
#define SWITCH_ENABLED_      1
#define ENABLED(b) _CAT(SWITCH_ENABLED_, b)
#define DISABLED(b) (!_CAT(SWITCH_ENABLED_, b))

您需要的最小更改是将_CAT 替换为非可变参数:

#define CAT(a,b) a##b

...为了将以下内容映射到0

  • SOMETHING 未定义
  • SOMETHING 定义为 0
  • SOMETHING 定义为 false

...和下​​面的1:

  • SOMETHING 未定义替换列表
  • SOMETHING 定义为 1
  • SOMETHING 定义为 true

...并且可以与 MSVS 2010 和大多数版本的 gnu 一起使用。

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 2018-01-18
    • 1970-01-01
    • 2012-02-17
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多