尝试在VS 2010中使用“#include <stdbool.h>”

25

我正在尝试在C程序中使用stdbool.h库文件。然而,当我尝试编译时,会出现错误消息,说intellisense无法打开源文件stdbool.h。

请问有谁能指导我如何让Visual Studio识别此文件?这个头文件是否有效?我正在阅读一本学习C编程的书。


6
寒冷的天气似乎无所不在(即使是在阴间下雪),VS 2013终于开始支持C99,包括stdbool.h。[http://blogs.msdn.com/b/vcblog/archive/2013/07/19/c99-library-support-in-visual-studio-2013.aspx] - John
10
@AlexandreC.:你好,来自2015年!最新版的Visual Studio现在有stdbool.h头文件了! - user3079266
1
我按照@Mints97的建议使用了VS 2015社区版,它解决了我的问题。当你在VS 2015中打开VS 2010项目时,它会自动要求升级C/C++项目所针对的编译器。VS 2015中的编译器针对C99,因此能够找到缺失的头文件。 - RBT
3个回答

31
typedef int bool;
#define false 0
#define true 1

这个方法很好用。Windows头文件也是相同的。完全没有必要为在 int 中存储两位值而“浪费”的内存担心。

正如亚历山大在评论中提到的,微软的C编译器(捆绑在Visual Studio中)不支持C99,并且可能永远不会支持。这真是令人遗憾,因为C99中支持stdbool.h和许多其他更有用的功能,但在Visual Studio中不支持。它停留在过去,只支持较旧的标准C89。我很惊讶你在试图在块的其它地方定义变量时没有遇到问题。每次我在VS中编写C代码时都会被困扰。

一个可能的解决方法是将Visual Studio配置为将代码编译为C++。然后你几乎可以使用C99书中的所有内容而无需担心编译器会出错。在C ++中,类型bool是内置的(虽然在C模式下为4字节类型,但在C ++模式下为1字节类型)。要进行此更改,您可以在IDE内编辑项目的编译设置,或者只需将文件的扩展名更改为cpp(而不是c)。VS将自动设置编译模式。

现代版的Visual Studio(2013及更高版本)提供了对C99的改进支持,但仍不完整。老实说,如果您试图学习C(因此现在是C99),更好的解决方案就是选择另一个编译器。MinGW是在Windows上运行的好选择。许多人喜欢Code::Blocks IDE。


非常感谢这个。我从只有几段文字里学到了很多!再次感谢!我将尝试一下你提到的编译器。祝你圣诞快乐! - John
这是一个好的、完整的答案。关于编译器,我使用过DevC++和Code::Blocks,但它们都没有适当的智能感知和代码着色,这使得再次阅读C代码变得困难。虽然我不喜欢Visual Studio强制安装在您的系统上的许多功能以及从2003版本到现在仍存在的许多错误,但它仍然是最好的IDE。Visual Studio 2010添加了一种能够将您放置在#ifdef编译器指令中但未激活的部分变灰的功能。当您跟踪编译错误时,这非常有帮助。 - AaA
以下是关于Connect的相关错误报告:773523748766。请投票支持,以便他们考虑实现C99和C11缺失的头文件。 - vulcan raven
2
请注意,在 Visual C++ 的 C++ 模式下,sizeof(bool) == 1。如果混合使用 C 和 C++ 代码,并在 C 侧将 bool 定义为 int,则会导致结构和 bool 数组出现有趣的问题。 - jpa
未来请注意:C99和C++11模式仅受支持于Visual Studio 2013及以后版本。在VS2012或更早版本上尝试编译使用这些模式的任何内容将无法正常工作 - Lincoln Bergeson
请参阅C99库在Visual Studio 2013中的支持 - chux - Reinstate Monica

13

创建您自己的文件来替换stdbool.h,文件应该如下所示:

#pragma once

#define false   0
#define true    1

#define bool int

在Visual Studio 2010中,我使用typedef int bool;时遇到了问题,正如其他地方建议的那样。IntelliSense会抱怨"类型说明符的组合无效"。似乎"name"bool"仍然是特殊的,即使它没有被定义。


我在这里引用了这个解决方案:https://github.com/metabench/jsgui-node-png/issues/2 PDF存档: https://www.dropbox.com/s/dgyzrx89w6g4oit/npm%20install%20jsgui-node-p...pdf - Andre
1
这是针对IntelliSense的特殊说明,因为前端IntelliSense编译器是C++编译器。具体来说,在VS 2010中,它是EDG编译器。您可以忽略IntelliSense警告。 - Cody Gray

4

需要提醒的是,在x64平台上,VS2017(之前的版本我不确定)将bool定义为C++中1字节的值(例如,一个char)。所以这段代码

typedef int bool;

如果在C文件中使用作为int(4个字节),并在C++中使用作为本地bool,可能非常危险(例如,在.h中的struct编译时大小可能会因为使用不同的语言而有所不同)。


这是正确的答案,这不仅对于结构体是一个真正的问题,而且如果C函数得到一个指向bool的指针(用于设置它),那么它将覆盖其他变量等。 - Hans Olsson

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