【问题标题】:VS2013 compilation issues with regard to usage of _Bool关于 _Bool 使用的 VS2013 编译问题
【发布时间】:2014-05-17 01:20:52
【问题描述】:

我正在 VS2013 中编译以下代码,

#if (__STDC_VERSION__ >= 199901L)
/* Inactive pre-processor block */
#else
/* Active pre-processor block */
#ifndef __bool_true_false_are_defined
typedef unsigned char _Bool;

#define bool  _Bool
#define false (0)
#define true  (1)
#define __bool_true_false_are_defined (1)

#endif /* __bool_true_false_are_defined */
#endif

我的目标如下

  • 如果编译器支持 C99,则不要创建 _Bool 类型,因为它已经内置。
  • 如果编译器不支持 C99,则创建自定义 _Bool 类型。

我的观察是代码进入了#else 块(不支持C99),但编译器仍然抱怨error C2632: 'char' followed by 'bool' is illegal

以下是我对上述逻辑的几个问题

  1. C99 支持的预处理器检查是否正确?
  2. 如果对 (1) 的回答是肯定的,那么为什么 C99 代码块在 VS2013 中不保持非活动状态。我假设 VS2013 支持 C99。
  3. 如果VS2013没有C99支持,那为什么编译器报错_Bool的typedef

【问题讨论】:

  • 我没有安装 VS2013 但 2012 仍然支持 C89(又名 ansi C);我想2013年是一样的。你的代码为我编译。您能否提供一个完整(但简短)的示例程序来演示您的错误?
  • @BLUEPIXY,根据 C2632,它表明 bool 已被设为正确的类型(但不确定,从哪个版本的 VS 进行了更改)。这是否意味着 VS2013 中不存在 C99 支持,但是有一些自定义设置可以为 _Bool 创建正确的类型
  • @simonc,我在 .c 文件中添加代码。以上是我正在尝试编译的所有测试代码sn-p。
  • VS 2013 implemented a number of C99 features 包括_Bool。我的猜测是他们可能没有碰到 STDC_VERSION 因为支持不完整。

标签: c visual-studio boolean c99


【解决方案1】:

看起来他们已经以相反的方式定义了它,_Bool 扩展为 bool。或者用

另外测试
#if defined(_Bool) || defined(bool)
..
#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多