C ++第三方库typedef与标准stdin.h冲突

时间:2018-07-04 21:37:23

标签: c++

问题

我正在尝试编写一个程序,以监听使用JACK audio server创建的音频流。单独使用时,该程序包可以正常工作,但是,当我尝试在文件中使用该文件以及对iostream之类的标准c ++库的引用时,在第3方lib和stdint.h之间会引发typedef冲突错误。

对于文件,我使用的都是JACK包中的jack/jack.hjack/types.h。它们包括对systemdeps.h文件的引用(在下面进行了扩展),这是错误的根源。

我试图在线查找解决方案,但是似乎没有任何效果。对于可能导致此问题的任何见解,或解决该问题的正确方向的观点,将不胜感激。

错误消息

2>\Jack\includes\jack/systemdeps.h(69): error C2371: 'int8_t': redefinition; different basic types (compiling source file src\jack\jack_interface.cpp)

2>stdint.h(17): note: see declaration of 'int8_t' (compiling source file src\jack\jack_interface.cpp)

2>\Jack\includes\jack/systemdeps.h(73): error C2371: 'int32_t': redefinition; different basic types (compiling source file src\jack\jack_interface.cpp)

2>stdint.h(19): note: see declaration of 'int32_t' (compiling source file src\jack\jack_interface.cpp)

2>\Jack\includes\jack/systemdeps.h(74): error C2371: 'uint32_t': redefinition; different basic types (compiling source file src\jack\jack_interface.cpp)

2>stdint.h(23): note: see declaration of 'uint32_t' (compiling source file src\jack\jack_interface.cpp)

我的实现

// jack_interface.cpp
#include <iostream>
#include "jack/jack.h"                // Core library .h
#include "jack/types.h"               // library types .h
#include "jack/jack_interface.h"      // My .h extending the lib

namespace jack 
{
}

这是我能写出引发错误的最低要求。

jack_interface.h为空。

jack.h和types.h都包含对systemdeps.h的引用,该冲突是在其中创建的。

仅在包含库和引用stdint.h的任何标准C ++文件都包含时(例如,仅 会引发错误)。 iostream。如果删除iostream,该库将运行100%。

我从第3方软件包中使用的库适用于32位Windows。我正在使用Visual Studio 2017进行32位编译。

systemdeps.h

正在引发冲突的库头文件。引发错误的行已在下面标记。 See file on github here.

#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(GNU_WIN32)

#include <windows.h>

#ifdef _MSC_VER     /* Microsoft compiler */
    #define __inline__ inline
    #if (!defined(int8_t) && !defined(_STDINT_H))
        #define __int8_t_defined
        typedef char int8_t;                 <-- ERROR
        typedef unsigned char uint8_t;
        typedef short int16_t;
        typedef unsigned short uint16_t;
        typedef long int32_t;                <-- ERROR
        typedef unsigned long uint32_t;      <-- ERROR
        typedef LONGLONG int64_t;
        typedef ULONGLONG uint64_t;
    #endif

1 个答案:

答案 0 :(得分:3)

”systemdeps.h”在提供这些typedef方面做得相当糟糕。根据您的评论,它正在检查错误的包含卫队。即使是正确的,如果在该标头后面包含<stdint.h>,也会遇到问题。因此,您必须做两件事。首先,无论您在哪里使用任何jack标头,都应在添加#include <stdint.h>标头之前,先在{strong>之前添加jack。其次,在#include <stdint.h>之后立即添加#define _STDINT_H。这样,您就可以从编译器的标头中获取typedef,并告诉”systemdeps.h”不要提供其自己的定义。这很繁琐且容易出错,因此您可以考虑创建自己的标头,以便在一处完成所有操作。