Linux — C ++: :: ntohs () не работает на более высоких уровнях оптимизации

у меня есть .cpp файл: htonstest.cpp, я использую g++ скомпилировать это:

$ g++ -o test htonstest.cpp

Работает и программа ./test тоже работает

Но когда я использую automake для компиляции, возникает ошибка компиляции:

 htonstest.cpp: In function ‘int main()’:
htonstest.cpp:6: error:expected id-expression before ‘(’ token.

Моя ОС — CentOS, версия gcc — 4.1.2, 20080704, версия autoconf — 2.59, версия automake — 1.9.6.

Воспроизвести:

$ aclocal
$ autoheader
$ autoconf
$ automake -a
$ ./configure
$ make

ntohstest.cpp:

 #include <netinet/in.h>
#include <iostream>

int main()
{
short a = ::ntohs(3);
std::cout << a << std::endl;
std::cin.get();
return 0;
}

configure.ac:

 AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([htonstest.cpp])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE([foreign])
# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.
# AC_CHECK_HEADERS([netinet/in.h])

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_CONFIG_FILES(Makefile)
AC_OUTPUT

Makefile.am:

 bin_PROGRAMS=main
main_SOURCES=htonstest.cpp

4

Решение

Это на самом деле не связано с автоинструментами, и я был весьма удивлен, когда тестировал вашу программу. Соответствующий код находится в netinet/in.h

#ifdef __OPTIMIZE__
...
# define ntohs(x) ...
...
#endif

Причиной сбоя кода в Automake является то, что Automake по умолчанию -O2, и когда -O2 включен, ntohs() это макрос.

Исправление

использование ntohs(3) вместо ::ntohs(3),

Альтернативное исправление

Добавьте следующую строку после ваших включений:

#undef ntohs

Документация

byteorder(3) man-страница гласит:

htons() функция преобразует короткое целое без знака hostshort от порядка байтов хоста к порядку байтов сети.

Так что, на мой взгляд, это в лучшем случае грубый для библиотеки, чтобы определить htons() макро.

7

Другие решения

Других решений пока нет …