C语言没有bool类型?还有关于VS2010的问题

10

我使用的是VS 2010专业版。

首先,C语言没有bool类型?我只能使用带有0/1的int类型。这似乎很奇怪,因为大多数语言都认为布尔类型是一种标准类型。

此外,我有Visual Studio 2010 Pro,但是没有"C项目"选项。我只创建了一个空的C++项目。文件名以".c"结尾。

这样做会导致关键词出现问题(编辑器中bool被高亮显示/有效,但编译器不喜欢它)。

我尝试修复/添加组件,但它们只提供了C#,F#,C ++和Visual Basic;却没有C?


1
对于那些使用VS2013或更高版本的人,bool现在可以通过stdbool.h支持。我不确定VS2012是否支持。 - Edward Brey
6个回答

17

最新的 C 标准(C99)确实有 bool 类型。只需包含 stdbool.h,就可以使用它。不幸的是,MSVC 对 C 的支持非常有限,仅支持部分 C89。


你指的是stdbool.h。无论如何,OP正在使用不支持C语言,更不用说“最新C标准”的MSVC。 - R.. GitHub STOP HELPING ICE
3
@R:MSVC支持C语言(C90),但不支持C99。 - Nemanja Trifunovic
1
@Nemanja:不行。wprintf(L"%s", "hello world\n");是C语言的一部分,无法在MSVC上运行。 - R.. GitHub STOP HELPING ICE
2
@R:这是C99的一部分,但不是C90的。我刚刚重新检查了标准(纸质版--真是个痛苦),它根本没有列出wprintf。 - Jerry Coffin
1
@Athabaska:我并不是在说你的评论有什么不好的地方 - 只是一些小趣闻(考虑到R.之前的例子)。此外,我以前从未听说过Codelite - 我得去看看。所以,谢谢你!(上次我看Code::Blocks时 - 诚然是很久很久以前 - 它运行缓慢,让我不太满意)。 - Michael Burr
显示剩余8条评论

6
当前的C语言(C99)有一个名为bool的类型(实际上是_Bool,但包括stdbool.h会为其声明一个typedef别名bool),但由于你正在使用MSVC,它对你不可用。无论如何,在C中使用布尔类型完全不符合惯用法,而且大多数情况下毫无用处。像其他人一样,只需使用int即可。或者,如果需要一个巨大的布尔数组,请自己制作位数组实现。

1
即使在C99中,is*函数也不会返回_Bool。请勿使用非惯用语和无用语! - pmg
2
在C语言中使用布尔类型完全不符合惯用法,而且大多数情况下也没有什么用处,有点像short类型。 - Steve Jessop
使用布尔值而不是整数可以使代码更易读。最近的MSVC版本在C代码中添加了对布尔值的支持。 - Étienne

2

在C99之前,C语言没有真正的布尔类型。

因此,习惯用法上,C语言并不会使用布尔值符号或表达式(即,你不会看到很多针对“true”或“false”的显式测试)。相反,任何零值积分表达式或NULL指针将被评估为“false”,而任何非零值积分表达式或非NULL指针将被评估为“true”。因此,你会看到很多这样的代码:

foo *bar = malloc(sizeof *bar * ...);
if (bar) // equivalent to writing bar != NULL
{
   // bar is non-NULL
} 

关系和相等表达式,如a == bc < d将计算出一个整数类型的值,其值为1(真)或0(假)。

有些人通过定义自己的TRUE或FALSE符号常量来引入它们,例如:

#define TRUE  (1)  // or (!FALSE), or (1==1), or...
#define FALSE (0)  // or (!TRUE), or (1==0), or ...

不幸的是,有些人偶尔会拼错0或1(或者本应评估为0或1的表达式); 有一次,因为有人搞砸了并将标题放在了TRUE == FALSE的位置,我花了一个下午追寻自己的尾巴。

不巧的是,那一天我彻底停止使用符号常量来表示布尔值。


2

关于bool类型的信息,请参见R.的答案

不幸的是,当MSVC编译C代码时,它不支持C99 - 它只有一些零碎的功能(通常是C99库中C++所需的),但在大多数情况下,它仅支持C90。

至于编辑器中仍然突出显示bool - MSVC的高亮功能可能很复杂,但它并不考虑区分C、C++和C++/CLI之间的区别。例如,如果您使用的是仅限CLI的构造,则即使您的项目与CLI无关,它也将被突出显示为CLI。


1
关于布尔类型: 在C语言中,任何非零值都被视为“真”(而零则是“假”)。当检查指针的值时,这非常方便:
if ((ptr = malloc(sizeof(foo))) != 0) ...

可以缩短为:

if (ptr = malloc(sizeof(foo))) ...

C语言被设计成一种“中级”语言,即介于汇编语言和传统的“高级”语言之间。它也被设计成紧凑/简洁的语言。因此,它具有极简主义的风格,例如上述支持“速记”的方式,以及省略内置布尔数据类型(截至C99,正如其他人所指出的那样)。

许多库/框架(我知道的)都会做类似以下的事情:

#define BOOL int
#define FALSE 0
#define TRUE (!FALSE)

这意味着您应该避免直接将值/结果与TRUE进行比较。请考虑以下情况:给定int a = 2; int b = 3;,那么if (a)if (b)都为true,但ab不相等。
关于语法高亮: C ++确实有bool类型,我猜这就是编译器突出显示单词的原因。但是,源文件以.c结尾,标记为C代码,因此不允许使用该类型。 似乎语法高亮应该能够捕捉到这一点。
关于缺少C组件: 如果我正确理解了问题:简短的答案是,为了进行“托管代码”(即.NET)开发 - 这就是您必须使用.NET运行时支持的语言,例如C#,VB(.NET),F#或C++。 (C ++在“托管”和“非托管”两个版本中都可用,这意味着您可以针对.NET或Windows API进行开发。)
您是否受到使用C而不是其他语言的指令?

我使用C语言是因为我想学习它以及OpenGL(也是C语言)。一旦我学到更多,我可能会转向C++。我有Java的经验。 - user697111
我相信你可能已经听过这个建议,但是你可能会更喜欢使用C#。对于C#,有一些OpenGL的封装库,例如http://www.opentk.com/。 - David

1
如果你在使用C语言进行开发,我建议你使用其他编译器,因为VC++不是现代的C编译器,也不支持C99标准。如果你在Windows上开发,请尝试使用MinGW,它基本上可以让你使用GCC并访问Windows API。
如果你坚持要使用Visual Studio,那么请创建自己的头文件来替代stdbool.h:
#pragma once

#define false   0
#define true    1

#define bool int

我发现如果我尝试使用typedef来定义bool,Visual Studio 2010会报错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接