我有一个cpp源文件,其中包含以下Linux uapi标头:
#include <linux/netfilter_ipv4/ip_tables.h>
我正在使用RH6,但标题似乎与Linux内核主线中的标题相同:http://lxr.free-electrons.com/source/include/uapi/linux/netfilter_ipv4/ip_tables.h
问题是在用g ++编译我的cpp源文件时,我(显然)收到以下错误:
/usr/include/linux/netfilter_ipv4/ip_tables.h:222: error: invalid conversion from 'void*' to 'xt_entry_target*'
我知道我可以用-fpermissive
标志超越它,但这不是解决方案。
另外,我尝试将包含在extern "C" {}
块中(据我所知,应该让编译器将其中的所有内容看作C代码并允许隐式转换),但错误不会消失
C ++程序如何处理这种C不兼容问题? (无法直接编辑源代码导致问题)
答案 0 :(得分:0)
使用以下预处理语句:
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2 && __GNUC_PATCHLEVEL__ > 3)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6) || (__GNUC__ == 4 && __GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 3)
#pragma GCC diagnostic push
#endif
#pragma GCC diagnostic ignored "-fpermissive"
#include <linux/netfilter_ipv4/ip_tables.h>
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6) || (__GNUC__ == 4 && __GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 3)
#pragma GCC diagnostic pop
#endif
#else
#error at least GCC 4.2.4 is required
#endif
使用以下网址提供的文档:https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas
考虑到GCC 4.2.4中引入了Diagnostic Pragmas,并且在GCC 4.6.4中引入了对这些pragma的推/弹操作的支持。
目前我正在使用4.4.7编译,因此pragma对整个翻译单元生效,但至少它不会强迫我在调用编译器时提供标志。
感谢@Richard Critten指出我正确的方向。