Как я могу исправить определения `getaddrinfo`, которые не были найдены? - PullRequest
1 голос
/ 05 июня 2019

Я получаю следующие ошибки при попытке скомпилировать мой код:

main.c:13:40: note: each undeclared identifier is reported only once for each function it appears in
main.c:17:14: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function); did you mean ‘EAI_FAMILY’?
         case EAI_ADDRFAMILY:
              ^~~~~~~~~~~~~~
              EAI_FAMILY
main.c:29:14: error: ‘EAI_NODATA’ undeclared (first use in this function); did you mean ‘EAI_NONAME’?
         case EAI_NODATA:
              ^~~~~~~~~~
              EAI_NONAME

Я пробовал включать разные заголовки (например, netinet/in.h), а также компилировать с разными стандартами (gnu90,gnu99, gnu11), но, похоже, ничего не решает ошибку.

Ниже приведен мой код:

// Name: main.c
// Compile: gcc -std=gnu11 main.c
// Error:
//   main.c: In function ‘main’:
//   main.c:18:14: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function); did you mean ‘EAI_FAMILY’?
//            case EAI_ADDRFAMILY:
//                 ^~~~~~~~~~~~~~
//                 EAI_FAMILY
//   main.c:18:14: note: each undeclared identifier is reported only once for each function it appears in
//   main.c:30:14: error: ‘EAI_NODATA’ undeclared (first use in this function); did you mean ‘EAI_NONAME’?
//            case EAI_NODATA:
//                 ^~~~~~~~~~
//                 EAI_NONAME

#include <stddef.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

int main()
{
    struct addrinfo* res;
    char* domain = "google.com";

    switch(getaddrinfo(domain, "http", NULL, &res))
    {
        case 0:
            break;
        case EAI_ADDRFAMILY:
            break;
        case EAI_AGAIN:
            break;
        case EAI_BADFLAGS:
            break;
        case EAI_FAIL:
            break;
        case EAI_FAMILY:
            break;
        case EAI_MEMORY:
            break;
        case EAI_NODATA:
            break;
        case EAI_NONAME:
            break;
        case EAI_SERVICE:
            break;
        case EAI_SOCKTYPE:
            break;
    }

    return 0;
}

1 Ответ

1 голос
/ 05 июня 2019

Оказалось, что хотя два определения, EAI_ADDRFAMILY и EAI_NODATA, были определены в netdb.h в моей системе, они были не , так как требовали, чтобы было определено __USE_GNU.

Чтобы включить __USE_GNU (косвенно), мы определяем _GNU_SOURCE в верхней части файла.Рабочий файл выглядит следующим образом:

// Name: main.c
// Compile: gcc -std=gnu11 main.c

#define _GNU_SOURCE // Need for EAI_ADDRFAMILY and EAI_NODATA

#include <stddef.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

int main()
{
    struct addrinfo* res;
    char* domain = "google.com";

    switch(getaddrinfo(domain, "http", NULL, &res))
    {
        case 0:
            break;
        case EAI_ADDRFAMILY:
            break;
        case EAI_AGAIN:
            break;
        case EAI_BADFLAGS:
            break;
        case EAI_FAIL:
            break;
        case EAI_FAMILY:
            break;
        case EAI_MEMORY:
            break;
        case EAI_NODATA:
            break;
        case EAI_NONAME:
            break;
        case EAI_SERVICE:
            break;
        case EAI_SOCKTYPE:
            break;
    }

    return 0;
}
...