ошибка с объявлением enum - PullRequest
       16

ошибка с объявлением enum

3 голосов
/ 15 декабря 2009

У меня очень простой код c:

         #include<stdio.h>
        int main()
        {
          enum boolean{true,false};
          boolean bl=false;
          if(bl==false)
             printf("This is the false value of boool\n");
         boolean bl1=true;
          if(bl1==true)
           {
            printf("This is the true value of boool\n");
           }
    return 0;
   }

я просто пытался использовать enum переменную типа. Но это выдает следующую ошибку:

tryit4.c:5: error: ‘boolean’ undeclared (first use in this function)
tryit4.c:5: error: (Each undeclared identifier is reported only once
tryit4.c:5: error: for each function it appears in.)
tryit4.c:5: error: expected ‘;’ before ‘bl’
tryit4.c:6: error: ‘bl’ undeclared (first use in this function)
tryit4.c:8: error: expected ‘;’ before ‘bl1’
tryit4.c:9: error: ‘bl1’ undeclared (first use in this function)

Я не вижу причин для этого. Не могли бы вы объяснить, в чем причина?

Ответы [ 7 ]

10 голосов
/ 15 декабря 2009

В C существует два (на самом деле больше, но я держу это при этом) пространства имен: обычные идентификаторы и идентификаторы тегов. Объявление структуры, объединения или перечисления вводит идентификатор тега:

enum boolean { true, false };
enum boolean bl = false;

Пространство имен, из которого выбирается идентификатор, определяется синтаксисом вокруг. Здесь к нему добавляется enum. Если вы хотите ввести обычный идентификатор, поместите его в объявление typedef

typedef enum { true, false } boolean;
boolean bl = false;

Обычные идентификаторы не нуждаются в специальном синтаксисе. Вы можете объявить тег и обычный тоже, если хотите.

7 голосов
/ 15 декабря 2009

Когда вы объявляете enum boolean { true, false }, вы объявляете тип с именем enum boolean. То имя, которое вы должны будете использовать после этого объявления: enum boolean, а не просто boolean.

Если вам нужно более короткое имя (например, просто boolean), вам придется определить его как псевдоним для исходного полного имени

typedef enum boolean boolean;

При желании вы можете объявить как тип enum boolean, так и псевдоним boolean в одном объявлении

typedef enum boolean { true, false } boolean;
7 голосов
/ 15 декабря 2009

Было бы неплохо определить ваше перечисление следующим образом:

typedef enum {
  False,
  True,
} boolean;

Пара причин:

  • true и false (строчные буквы), скорее всего, зарезервированные слова
  • false, равный 1, и true, равный 0, могут вызвать проблемы с логикой позже
7 голосов
/ 15 декабря 2009

Вы должны объявить переменные типа enum boolean, а не просто boolean. Используйте typedef, если вы найдете запись enum boolean b1 = foo (); громоздкий.

3 голосов
/ 15 декабря 2009

Вы объявляете перечисление, но не тип. То, что вы хотите, это

typedef enum{false, true} boolean;  // false = 0 is expected by most programmers

Есть еще несколько проблем с этим:
* true и false являются зарезервированными словами во многих компиляторах C
* явное использование true и false противоречит общей практике булевых выражений в C, где ноль означает false, а все, что не равно нулю, означает true. Например:

int found = (a == b);

<ч /> Изменить: Это работает с GCC 4.1.2:

[wally@zf ~]$ ./a.out
This is the false value of boool
This is the true value of boool
[wally@zf ~]$ cat t2.c
#include<stdio.h>
int main()
{
        typedef enum {true,false} boolean;
        boolean bl=false;
        if(bl==false)
                printf("This is the false value of boool\n");
        boolean bl1=true;
        if(bl1==true)
        {
                printf("This is the true value of boool\n");
        }
        return 0;
}
1 голос
/ 15 декабря 2009

Как показывают предыдущие ответы, используйте typedef:

typedef enum { true, false } boolean;
0 голосов
/ 01 февраля 2011

С FAQ - список функций, которые поддерживает C ++, но не включает C:

bool keyword

Этот FAQ немного неточен, и его лучше сформулировать как «список функций, которые поддерживает C ++, но не включает C89»

Добавьте #include <stdbool.h> к вашему коду, и он скомпилируется как C99 на компиляторе, который пытается реализовать C99 (например, gcc).

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