9

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
Jack Kelly
  • 18,264
  • 2
  • 56
  • 81
yetuweiba
  • 241
  • 1
  • 4
  • 13

1 Answers1

14

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.

Dietrich Epp
  • 205,541
  • 37
  • 345
  • 415
  • Oh, GREAT,THANK YOU, you tell me the reason.thanks very much. – yetuweiba Jan 21 '13 at 02:55
  • 1
    " So in my opinion, it is at best rude for the library to define an htons() macro. " Actually, POSIX says "The following [(htonl, htons, ntohs, nothl)] shall be declared as functions, or defined as macros, or both. If functions are declared, function prototypes shall be provided." http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/arpa_inet.h.html – lgeorget Mar 09 '16 at 15:24