Компиляция с -std = c ++ 11 на Cygwin шпалах доступных системных вызововC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Компиляция с -std = c ++ 11 на Cygwin шпалах доступных системных вызовов

Сообщение Anonymous »

Я исследовал портирование некоторого кода с более старой C ++ в более современную версию C ++ (например, C ++ 11 или выше). А потом я заметил, что какой -то сетевой код, не составляющий, когда я добавил флаг компилятора -std = c ++ 11 < /code> < /p>

Самый простой пример MVCE. Я нахожусь на последнем Cygwin (буквально установлен сегодня). g ++ --версия < /code> Указывает версию 7.3.0. < /p>

Возьмите следующий исходный файл, разделенный почти до ничего, но достаточно, чтобы показать проблему, которую я собираюсь объяснить. < /p>

Код: Выделить всё

#include 
#include 
#include 

int some_networking_code()
{
addrinfo* addr = NULL;
int flags = AI_NUMERICHOST;
return 0;
}
< /code>

На свежей установке Cygwin следующая команда работает просто хорошо: < /p>

g++ foo.cpp -c
< /code>

Но теперь переключитесь на компиляцию с C ++ 11. < /p>

g++ foo.cpp -c -std=c++11
< /code>

и полученный вывод компилятора: < /p>

foo.cpp: In function ‘int some_networking_code()’:
foo.cpp:8:4: error: ‘addrinfo’ was not declared in this scope
addrinfo* addr = NULL;
^~~~~~~~
foo.cpp:8:4: note: suggested alternative: ‘addr_t’
addrinfo* addr = NULL;
^~~~~~~~
addr_t
foo.cpp:8:14: error: ‘addr’ was not declared in this scope
addrinfo* addr = NULL;
^~~~
foo.cpp:8:14: note: suggested alternative: ‘addr_t’
addrinfo* addr = NULL;
^~~~
addr_t
foo.cpp:9:16: error: ‘AI_NUMERICHOST’ was not declared in this scope
int flags = AI_NUMERICHOST;
^~~~~~~~~~~~~~
Отладьте это, я смотрю на /ср/include/netdb.h и вижу, что определение для addrinfo ожидает макроса __ posix_visible будет больше или равным 200112 . Там определение для ai_numericonly завершено в аналогичном блоке. < /P>

Код: Выделить всё

#if __POSIX_VISIBLE >= 200112 && !defined(__INSIDE_CYGWIN_NET__)
struct addrinfo {
int             ai_flags;             /* input flags */
… 
#endif
< /code>

Используя переключатели -dm -e < /code>, мы можем спросить компилятора, какие макросы он тянет и фильтровал в posix_visible < /p>

$ g++ foo.cpp -c -dM -E | grep POSIX_VIS
#define __POSIX_VISIBLE 200809
< /code>

ОК, это выглядит правильно для традиционного C ++.  Давайте проверим это для C ++ 11 здание: < /p>

$ g++ foo.cpp -c -std=c++11 -dM -E | grep POSIX_VIS
#define __POSIX_VISIBLE 0
< /code>

__POSIX_VISIBLE
определяется как 0. И это объясняет, почему у нас есть ошибки выше. Но вот где я начинаю запутаться. Как был построен компилятор? Или что -то еще? Какой подходящий обходной путь, который не повлияет на построение на Linux, Mac, BSD и везде?

Подробнее здесь: https://stackoverflow.com/questions/521 ... stem-calls
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»