如何消除g++编译器中的“使用了但从未定义”的内联函数警告?

4

我正在使用mingw-w64。 我包含了strsafe.h,并得到以下警告:

warning: inline function 'HRESULT StringCchPrintfA(STRSAFE_LPSTR, size_t, STRS
AFE_LPCSTR, ...)' used but never defined [enabled by default]

我使用的唯一标志是-Wall -DDEBUG -g。我知道你必须在同一个头文件中定义内联函数,我查看了strsafe.h,并且清楚地看到头文件中的StringCchPrintfA,所以我不知道为什么会出现这个错误。此外,这里有一个链接到strsafe.h的链接,如果您想自己查看头文件编辑: 我在网上找到了以下代码片段(如果有人可以提供更多信息,请告诉我,在评论中他们想说什么?):
// Work around lack of strsafe library in mingw-w64, do let their
// strsafe.h provide inlines of StringCchVPrintfA etc, avoid linking
// errors in a debug build.
#ifdef __CRT__NO_INLINE
#undef __CRT__NO_INLINE
#define DID_UNDEFINE__CRT__NO_INLINE
#endif
extern "C" {

#endif

#include <strsafe.h>

#ifdef __MINGW32__
}

#ifdef DID_UNDEFINE__CRT__NO_INLINE
#define __CRT__NO_INLINE
#endif
#endif

这个函数是否没有被定义是因为__CRT__NO_INLINE在某处被定义了吗? - tpg2114
如果定义了___CRT__NO_INLINE,那么StringCchPrintfA就不会是内联函数。 - Jesse Good
我不同意--在您发布的标题链接中,它有#define STRSAFEAPI static __inline HRESULT WINAPI,因此该函数是static __inline,无论__CRT__NO_INLINE的状态如何。 - tpg2114
@tpg2114:很好的发现,我的本地副本不同,所以我提供的链接可能已经过时了(对此感到抱歉)。 - Jesse Good
@tpg2114:谢谢,通过在包含strsafe.h之前添加#undef__CRT__NO_INLINE,警告消失了,所以我必须找到它被定义的地方。 - Jesse Good
在你摆脱它之前,请确保它没有任何必要的原因。毕竟,你只是得到了一个警告,而不是错误! - tpg2114
1个回答

1

该注释表明应该有一个strsafe库,但实际上并没有。__CRT__NO_INLINE定义必须意味着编译库在某个地方提供函数,而不是使用来自头文件的内联函数。

因此,在该库不存在的情况下(但它似乎认为应该存在),允许使用内联函数。

但是,这是为了解决链接错误。您在编译代码时是否遇到链接错误?还是只有警告?如果只有警告,则表示您实际上已经拥有了strsafe库。完全有可能无法消除消息并仍然使用函数的编译版本。


+1:感谢帮助。我决定用 strsafe.h 包装一个 #undef __CRT__NO_INLINE#define __CRT__NO_INLINE。我找到的唯一其他信息是这个。此外,Microsoft 有一个 strsafe.lib 文件可以链接,但 Mingw-w64 没有它,所以这就是评论所说的内容。 - Jesse Good

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接