разыменование указателя на неполный тип

Я видел много вопросов на этом, но я собираюсь задать вопрос по-другому без определенного кода. Существует ли способ легкого определения, что заставляет тип быть неполным? В моем случае я использую кого-то код elses, и я абсолютно уверен, что не имею права заголовков, но (так как компьютеры делают этот материал намного быстрее, и лучше, чем человеческие глазные яблоки) там способ заставить в компиляторе говориться, "эй Вы думаете, что у Вас есть тип X в строке 34, но это на самом деле отсутствует". Сама ошибка только обнаруживается, когда Вы присваиваетесь, который не очень полезен.

61
задан Levent Divilioglu 13 February 2017 в 13:59
поделиться

3 ответа

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

struct a {
    int q; 
}; 
struct A *x; 
x->q = 3;

Компилятор знал, что struct A был структурой, несмотря на то, что A был полностью неопределенным, благодаря ключевому слову struct .

Это было в C ++, где такое использование struct нетипично (и, как выясняется, может привести к простреливанию). В C, если вы используете

typedef struct a {
    ...
} a;

, вы можете использовать a в качестве имени типа и опустить struct позже. Это приведет к тому, что компилятор позже выдаст вам ошибку неопределенного идентификатора, а не неполный тип, если вы неправильно наберете имя или забудете заголовок.

46
ответ дан 24 November 2019 в 17:23
поделиться

Что значит ошибка появляется только при назначении? Например, в GCC, без присваивания:

int main() {
    struct blah *b = 0;
    *b; // this is line 6
}

incompletetype.c: 6: error: указатель разыменования на неполный тип .

Ошибка - в строке 6, здесь я использовал неполный тип, как если бы это был полный тип. До тех пор я был в порядке.

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

В качестве альтернативы (хороший момент, potatoswatter) ошибка находится в строке, где был определен b , когда вы имели в виду , чтобы указать какой-то тип, который действительно существует, но на самом деле указал ] бла . Найти определение переменной b в большинстве случаев не должно быть слишком сложно. IDE обычно могут сделать это за вас, предупреждения компилятора могут не беспокоить. Однако это довольно отвратительный код, если вы не можете найти определения того, что используете.

10
ответ дан 24 November 2019 в 17:23
поделиться

Я не совсем понимаю, что это за проблема. Неполный тип - это не тот тип, который «отсутствует». Неконкурентный тип - это тип, который объявлен , но не определен (в случае структурных типов). Найти не определяющее объявление легко. Что касается поиска недостающего определения ... компилятор здесь вам не поможет, поскольку именно он и вызвал ошибку.

Основной причиной неполных ошибок типа в C являются опечатки в именах типов, которые не позволяют компилятору сопоставить одно имя с другим (например, при сопоставлении объявления с определением). Но, опять же, компилятор здесь не поможет. Компилятор не догадывается об опечатках.

7
ответ дан 24 November 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: