C++错误:"内联"只能出现在函数上

C++ error: 'inline' can only appear on functions

本文关键字:函数 错误 内联 C++      更新时间:2023-10-16

所以我被一个棘手的问题困住了,已经花了一个小时来调查了。

我有一个项目,其中有一些相当旧的c++代码,我需要添加一些c++ 11代码。该项目之前正在编译,所以可以肯定的是,这个问题是由我在CMakelist.txt中添加以下内容引起的:

set (CMAKE_CXX_STANDARD 11)

问题是由这些定义引起的:

#define lt(a, b) (  ((a) <  -b) )
#define ge(a, b) (! ((a) <  -b) )
#define le(a, b) (  ((a) <=  b) )
#define gt(a, b) (! ((a) <=  b) )
#define eq(a, eps) ( (((a) <= eps) && !((a) < -eps)) )
#define ne(a, eps) ( !eq(a,eps) )

这是我得到的错误:

/Users/bs/util.h:284:22: note: expanded from macro 'eq'
#define eq(a, eps) ( (((a) <= eps) && !((a) < -eps)) )
                     ^
In file included from /Users/bs/geom.cc:35:
In file included from /Users/bs/coord.h:30:
In file included from /Users/bs/vronivector.h:6:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream:38:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios:216:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__locale:15:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string:678:12: error: 'inline' can
      only appear on functions
    static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
           ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make[2]: *** [src/CMakeFiles/vroni.dir/geom.cc.o] Error 1
make[1]: *** [src/CMakeFiles/vroni.dir/all] Error 2
make: *** [all] Error 2

这里有什么问题,可以解决吗?

符号'eq'有名称冲突不幸的是,c风格的宏做了一个文字文本替换,所以与eq相关的文本被塞进语句中,你看到的错误信息产生如下所示:

static inline _LIBCPP_CONSTEXPR bool  ( (((char_type __c1) <= eps) && !(char_type __c1) < -eps))  _NOEXCEPT

最好的解决方案是停止使用宏,并找到另一种方法来定义你的'eq' 'lt'等函数。

例如,你可以这样替换eq宏:
template<typename T>bool eq(T a,T eps) 
{
    return (a <= eps && a >= -eps);
}

一个不太好的解决方案是为你的宏提出一个不太可能与其他包中使用的符号冲突的命名约定(例如,你可以将你的宏命名为EQ或EQ_(不要使用开头下划线,这是另一个问题)