GCC обнаруживает ошибки в файле stdio.h MinGW

Я пытаюсь скомпилировать пример кода C с помощью GCC / MinGW в Windows 7. Пример кода включает некоторые локальные файлы заголовков, которые в конечном итоге включают stdio.h, и я получаю эту ошибку, когда пытаюсь скомпилировать:

c:\mingw\include\stdio.h:345:12: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__mingw__snprintf'
extern int __mingw_stdio_redirect__(snprintf)(char*, size_t, const char*, ...);

Для меня это странно. Как могли быть ошибки в stdio.h?

В файле, включенном перед "stdio.h", может быть что-то, что сбивает компилятор с толку. Вы по-прежнему получаете сообщение об ошибке, если попытаетесь сначала скомпилировать только один файл, содержащий "stdio.h"?

Tim Randall 25.10.2018 18:23

Пожалуйста, опубликуйте содержимое заголовочного файла pcap.h Пожалуйста, НЕ размещайте ссылки на код, а скопируйте / вставьте код в свой вопрос

user3629249 25.10.2018 18:52

есть только две действительные подписи для main(): int main( void ) и int main( int argc, char *argv[] )

user3629249 25.10.2018 18:53

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

user3629249 25.10.2018 18:56

@ user3629249: файл pcap.h (и, если на то пошло, пример кода) являются частью пакета кода winpcap, а не работой OP. Так что ваш комментарий об основных прототипах не так хорошо направлен, как мог бы быть.

rici 25.10.2018 22:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
353
1

Ответы 1

касательно:

if (i == 0)
{
    printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
    return 0;
}  
pcap_freealldevs(alldevs);

поскольку переменная i инициализируется значением 0 и никогда не изменяется, этот оператор if () всегда будет true. Одним из результатов является вызов: pcap_freealldev() никогда не будет вызван.

scope переменных следует ограничивать насколько разумно.

Код никогда не должен зависеть от ОС, чтобы убирать за собой. предложить

#include <stdio.h>
#include <stdlib.h>
#include "pcap.h"

int main( void )
{
    pcap_if_t *alldevs = NULL;
    char errbuf[PCAP_ERRBUF_SIZE];

    /* Retrieve the device list from the local machine */
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1)
    {
        fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
        exit(1);
    }

    /* Print the list */
    for( pcap_if_t *d = alldevs; d != NULL; d= d->next)
    {
        printf("%d. %s", ++i, d->name);
        if (d->description)
            printf(" (%s)\n", d->description);
        else
            printf(" (No description available)\n");
    }

    if ( ! alldevs )
    {
        printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
    }

    /* We don't need any more the device list. Free it */
    pcap_freealldevs(alldevs);
}
i изменяется в строке 20 (printf("%d. %s", ++i, d->name);), которая выполняется для каждого найденного устройства. Предположительно, разработчики winpcap (нет OP) считали бессмысленным освобождать всех разработчиков, если устройство не было найдено. В любом случае этот ответ не имеет отношения к вопросу OP. (Я согласен, что ваш тест лучше, чем их тест, fwiw. Но в конце концов эффект тот же.)
rici 25.10.2018 22:37

Другие вопросы по теме