C не имеет bool? Также вопрос VS2010 - PullRequest
5 голосов
/ 15 апреля 2011

Я использую VS 2010 Pro.

Во-первых, C не имеет тип bool?Я просто должен использовать int с 0/1.Кажется странным, так как большинство языков считают boolean стандартным типом.

Также у меня Visual Studio 2010 Pro, но нет проекта "C".Я только что создал пустой C ++ проект.Имена файлов заканчиваются на .c

Проблема в том, что ключевые слова перепутаны (показывает bool как выделенный / допустимый в редакторе, но компилятору это не нравится).

Iпошел на ремонт / добавление компонентов и у них есть C #, F #, C ++, Visual Basic;но нет C?

Ответы [ 6 ]

12 голосов
/ 15 апреля 2011

Новейший стандарт C (C99) действительно имеет тип bool.Просто включите stdbool.h, и вы можете использовать его.К сожалению, MSVC вообще не имеет должной поддержки C.Только частичный C89.

5 голосов
/ 15 апреля 2011

Текущий язык C (C99) имеет тип bool (на самом деле _Bool, но включая stdbool.h объявляет typedef псевдоним bool для него), но, поскольку вы используете MSVC, это не так доступно для вас. В любом случае, использование булевых типов в C совершенно не идиоматично и в значительной степени бесполезно. Просто используйте int, как и все остальные. Или, если вам нужен их гигантский массив, создайте свою собственную реализацию битового массива.

2 голосов
/ 15 апреля 2011

C не имел фактического логического типа до C99.

В результате идиоматический 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 (true) или 0(ложный).

Некоторые люди вводят свои собственные ИСТИННЫЕ или ЛОЖНЫЕ символические константы, выполняя что-то вроде

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

К сожалению, некоторым из этих людей иногда удается неправильно ввести 0 или 1 (или выражения, которые должныоценить до 0 или 1);Однажды я провел день, гоняясь за своим хвостом, потому что кто-то облажался и уронил заголовок, где TRUE == FALSE.

Не случайно, это был тот день, когда я вообще перестал использовать символические константы для логических значений.

1 голос
/ 18 января 2013

Если вы разрабатываете на 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 жаловался, если я пытался использовать typedef вместо #define для определения bool.

1 голос
/ 15 апреля 2011

См. Ответ Р. для получения информации о типе bool.

К сожалению, MSVC не поддерживает C99 при компиляции кода C - он имеет биты и кусочки (как правило, вещи в библиотеке C99, которые требуются C ++), но по большей части она поддерживает только C90.

Что касается bool, все еще выделяемого в редакторе - выделение в MSVC может быть сложным, нов нем не учитывается различие между C, C ++ и C ++ / CLI.Например, если вы используете конструкцию, предназначенную только для CLI, она будет выделена как таковая, даже если ваш проект не имеет ничего общего с CLI.

1 голос
/ 15 апреля 2011

относительно типа bool: В C любое ненулевое значение считается «истинным» (а ноль - «ложным»). Это удобно, например, при проверке значения указателя:

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

можно сократить до:

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

C был разработан, чтобы быть языком "среднего уровня", то есть между ассемблером и традиционными языками "высокого уровня". Это было также разработано, чтобы быть компактным / кратким. Таким образом, он имеет минималистский характер, примером которого является поддержка «сокращения», подобного приведенному выше, а также отсутствие встроенного логического типа данных (до C99, как указывали другие).

Многие библиотеки / фреймворки (о которых я все равно знаю) делают что-то вроде следующего

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

Это означает, что вам следует избегать прямого сравнения значений / результатов с ИСТИНОЙ. Учтите следующее. Учитывая int a = 2; int b = 3;, тогда и if (a), и if (b) оцениваются как истина, но a и b не равны.

Относительно подсветки синтаксиса: C ++ действительно имеет тип bool, который, я предполагаю, почему компилятор выделяет это слово. Однако тот факт, что ваш исходный файл заканчивает его .c помечает его как код C, поэтому тип не разрешен. Похоже, подсветка синтаксиса должна поймать это, хотя.

Относительно отсутствия компонентов C: Если я правильно понимаю вопрос: короткий ответ таков: для разработки «управляемого кода» (т. Е. .NET) - то, что вам нужно сделать, чтобы использовать компоненты .NET - вам нужно используйте язык, поддерживаемый средой выполнения .NET, например C #, VB (.NET), F # или C ++. (C ++ доступен как в «управляемом», так и в «неуправляемом» вариантах, что означает, что вы можете разрабатывать как на .NET, так и на Windows API.)

Есть ли у вас какая-то директива использовать C в отличие от других языков?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...