Самый простой пример 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;
^~~~~~~~~~~~~~
Код: Выделить всё
#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Подробнее здесь: https://stackoverflow.com/questions/521 ... stem-calls
Мобильная версия