Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++: ::ntohs() fails on higher optimization levels

I have a .cpp file: htonstest.cpp. I use g++ to compile it:

$ g++ -o test htonstest.cpp

It works, and the program ./test works too.

But, when I use automake to compile it, has a compile error:

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

My OS is CentOS, gcc's version is 4.1.2 20080704, autoconf's version is 2.59, automake's version is 1.9.6.

To reproduce:

$ 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
like image 234
yetuweiba Avatar asked Jan 21 '13 02:01

yetuweiba


1 Answers

This is actually unrelated to autotools, and I was quite surprised when I tested your program. The relevant code is in netinet/in.h...

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

The reason that the code fails under Automake is because Automake defaults to -O2, and when -O2 is enabled, ntohs() is a macro.

The fix

Use ntohs(3) instead of ::ntohs(3).

The alternative fix

Add the following line after your includes:

#undef ntohs

Documentation

The byteorder(3) manpage reads:

The htons() function converts the unsigned short integer hostshort from host byte order to network byte order.

So in my opinion, it is at best rude for the library to define an htons() macro.

like image 98
Dietrich Epp Avatar answered Nov 04 '22 10:11

Dietrich Epp