如何解决C没有布尔?也是VS2010的问题
| 我正在使用VS 2010 Pro。 首先,C没有布尔类型?我只需要将int与0/1一起使用。似乎有些奇怪,因为大多数语言都将布尔值视为标准类型。 我也有Visual Studio 2010 Pro,但没有\“ C Project \”。我刚刚创建了一个空的C ++项目。文件名以.c结尾 这样做的问题是关键字混乱了(在编辑器中布尔显示为突出显示/有效,但编译器不喜欢)。 我去修理/添加组件,它们有C#,F#,C ++,Visual Basic;但是没有C?解决方法
最新的C标准(C99)确实具有布尔型。只要加上
stdbool.h
就可以使用。不幸的是,MSVC根本没有适当的C支持。仅部分C89。
,当前的C语言(C99)具有bool
类型(实际上是_Bool
,但包括stdbool.h
则为其声明了typedef
别名bool
),但是由于您正在使用MSVC,因此该语言不可用。无论如何,在C语言中使用布尔类型是完全惯用的,并且在很大程度上是无用的。像其他人一样使用int
。或者,如果您需要它们的庞大数组,请自己制作位数组实现。
,直到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 == b
或c < 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。
并非巧合的是,那天我完全停止对布尔值使用符号常量。
,有关bool
类型的信息,请参见R。\'s的答案。
不幸的是,MSVC在编译C代码时不支持C99-它有些零碎(通常是C ++在C99库中需要的东西),但是在大多数情况下,它仅支持C90。
至于仍在编辑器中突出显示的ѭ1--MSVC中的突出显示可能很复杂,但没有考虑C,C ++和C ++ / CLI之间的区别。例如,如果您使用仅CLI的结构,即使您的项目与CLI无关,它也会被突出显示。
,如果您使用C语言进行开发,则建议您使用其他编译器,因为VC ++不是现代的C语言编译器,并且不支持C99标准。如果您使用的是Windows,请尝试使用MinGW,它基本上可以使GCC可以访问Windows-y API。
如果您准备使用Visual Studio,请创建自己的头文件以代替stdbool.h使用:
#pragma once
#define false 0
#define true 1
#define bool int
我发现Visual Studio 2010抱怨如果尝试使用ѭ4而不是Visual15来定义Visual1ed。
,关于布尔类型:
在C语言中,任何非零值都视为\“ true \”(零为\“ false \”)。例如,在检查指针的值时,这很方便:
if ((ptr = malloc(sizeof(foo))) != 0) ...
可以缩短为:
如果(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)
均为真,但a
和b
不相等。
关于语法突出显示:
C ++确实有一个布尔类型,我猜这就是为什么编译器突出显示单词。但是,您的源文件以.c结尾的事实将其标记为C代码,因此不允许该类型。
不过,似乎语法高亮应该抓住了这一点。
关于缺少C组件:
如果我正确理解了这个问题:简短的答案是,为了进行“托管代码”(即.NET)开发-使用.NET组件是您要做的事情-您需要使用.NET运行时支持的语言,例如C#,VB(.NET),F#或C ++。
(C ++具有“托管”和“非托管”两种样式,这意味着您可以针对.NET或Windows API进行开发。)
您是否在某种指令下使用C而不是其他语言?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。