我有一个.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

最佳答案

这实际上与自动工具无关,当我测试您的程序时,我感到非常惊讶。相关代码在netinet/in.h中...

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

代码在Automake下失败的原因是因为Automake默认为-O2,并且在启用-O2时,ntohs()是宏。

解决方法

使用ntohs(3)而不是::ntohs(3)

替代修复

在包括之后添加以下行:
#undef ntohs

文献资料
byteorder(3)联机帮助页显示:



因此,我认为,库定义htons()宏是最好的做法。

10-02 22:42