C和C ++中的内联函数;沉默编译器警告

时间:2011-12-19 21:43:50

标签: c++ c inline

我嵌入了C代码,我用C ++框架进行单元测试。 C和C ++以不同的方式处理内联函数,所以当我想创建在两个源文件中使用的内联函数时,我这样做:

在头文件中:

#ifdef __cplusplus
# define INLINE inline
#else
# ifndef INLINE
#  define INLINE extern inline
# endif
#endif

INLINE Uint8 my_inline_function( Uint8 stuff )
{
    return stuff;  // not really, but it's not germane to the example
}

在两个.c文件中只有一个:

#define INLINE

现在C和C ++编译器都很满意,但是当我构建时,我收到了这个警告:

In file included from ../MyFile.c:28:0,
             from utest_MyFile.cpp:10:
../MyFile.h:53:0: warning: "INLINE" redefined
../MyFile.c:26:0: note: this is the location of the previous definition

有没有办法让这个警告沉默?

6 个答案:

答案 0 :(得分:4)

使用#ifndef

#ifndef INLINE
# ifdef __cplusplus
#  define INLINE inline
# else
#  define INLINE extern inline
# endif
#endif

答案 1 :(得分:1)

您可能在同一翻译单元中多次包含定义。您可以添加包含警戒:

#ifndef INLINE_DEFINED
#define INLINE_DEFINED

#ifdef __cplusplus
# define INLINE inline
#else
# ifndef INLINE
#  define INLINE extern inline
# endif
#endif

//...
#endif

或取消定义指令:

#undef INLINE

#ifdef __cplusplus
# define INLINE inline
#else
# ifndef INLINE
#  define INLINE extern inline
# endif
#endif

更难的方法是让警告静音:

#pragma warning( disable : /*warning number*/ )

不确定这是否是跨平台的。

答案 2 :(得分:1)

首先,正如查尔斯在评论中所说,你不应该这样做,C和C ++是完全不同的语言。特别是他们对inline功能的规则是不同的。它会让你痛苦。

然后,你有另一个设计缺陷。这很明显,因为您正在尝试重新定义宏。您的INLINE有两种不同的上下文,因此这些上下文代表两种不同的内容。我认为以下模型更容易和直接:

  • 使用inline作为头文件。没有宏或类似的东西,没有extern
  • 在一个C或C ++文件中为同一个函数放置一个“实例化”

你应该决定你的实例化是C还是C ++,不要在这里玩游戏。在C中,这样的实例化是

extern inline Uint8 my_inline_function( Uint8 stuff );

(C不会调用该实例化,但让我们使用与C ++相同的术语)

在C ++中它将是

Uint8 my_inline_function( Uint8 stuff );

就是这样,不需要魔术:

  • 包含头文件的所有编译单元都有一个 可定义
  • 适用于您仍然需要链接器符号的所有情况 将使用实例化

编辑:

看到你的评论(这并没有让我完全相信)我认为只要在头文件中有一个宏来实例化就会更好

#ifdef __cplusplus
# define INSTANT
#else
# define INSTANT extern inline
#endif

然后在一个.c或.C或其他任何你需要说服编译器

INSTANT Uint8 my_inline_function( Uint8 stuff );

答案 3 :(得分:0)

我怀疑这是造成问题的原因

#ifdef __cplusplus
# define INLINE inline

尝试将其更改为

#ifdef __cplusplus
# ifndef INLINE
# define INLINE inline
#endif

答案 4 :(得分:0)

你应该在自己的头文件中有#define INLINE...,并且有自己的标题保护:

(inline.h)

#ifndef INLINE_DEFINED

#ifdef __cplusplus
# define INLINE inline
#else
# ifndef INLINE
#  define INLINE extern inline
# endif
#endif

#endif

然后,您应该将#include "inline.h"放在需要它的任何文件的顶部附近。

答案 5 :(得分:0)

我很欣赏避免组合C和C ++的建议,但我们觉得更严格的类型检查和更简单易用的单元测试框架的好处超过了这些打嗝。鉴于此,我发现最干净的方法是在.c文件中替换

#define INLINE

#ifndef __cplusplus
# define INLINE
#endif