ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C::: ntohs()在更高的优化级别上失败

2019-06-13 04:38:07  阅读:228  来源: 互联网

标签:c-2 linux autoconf automake


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

解决方法:

这实际上与autotools无关,当我测试你的程序时我很惊讶.相关代码在netinet / in.h中…

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

代码在Automake下失败的原因是因为Automake默认为-O2,而启用了-O2,ntohs()是一个宏.

修复

使用ntohs(3)代替:: ntohs(3).

替代修复

在您的包含后添加以下行:

#undef ntohs

文档

byteorder(3)手册页内容如下:

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

所以在我看来,库最好是定义一个htons()宏.

标签:c-2,linux,autoconf,automake
来源: https://codeday.me/bug/20190613/1230446.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有