C++ C对C++;枚举与外部的链接”;";

C++ C对C++;枚举与外部的链接”;";,c++,c,enums,linkage,C++,C,Enums,Linkage,我有一个仅声明了非范围枚举的标头: foo.h: #ifndef FOO_BAR_ENUM_H #define FOO_BAR_ENUM_H typedef enum Foo { Bar, BigBar, LittleBar, MassiveBar BarCount } Foo; #endif 我使用C和C++两个头。它应该由外部的“C”块保护吗?包含两个编译器的链接很好,但是这种用法中是否存在链接差异,对于编译器来说是有效的,但对于一个幼稚的用户来

我有一个仅声明了非范围枚举的标头:

foo.h:

#ifndef FOO_BAR_ENUM_H
#define FOO_BAR_ENUM_H

typedef enum Foo {
    Bar,
    BigBar,
    LittleBar,
    MassiveBar
    BarCount
} Foo;

#endif

<>我使用C和C++两个头。它应该由外部的“C”块保护吗?包含两个编译器的链接很好,但是这种用法中是否存在链接差异,对于编译器来说是有效的,但对于一个幼稚的用户来说可能不是预期的?

此标头不会生成任何用于链接的符号,因此不必使用
外部“C”来保护它Boo.

这是有效的C和有效的C++,如果这是你要问的。你不必与头文件链接。@ NeilButterworth在两个文件中都是“有效的”并不一定意味着两者都是“相同的”。对于要同时在C和C++中工作的头文件,总是将它们包在<代码>外“C”< /> >(<代码>{\n#endif
,类似于在末尾关闭块)。这样,您甚至不必询问是否需要比页眉级别更细的粒度,拆分页眉。任何一个页眉都应该在两者中兼容,或者不在两者中使用。当您发现自己在想,“X不重要,所以我很安全。”将Y添加到头中的时间提前几周、几个月或几年,突然它就起了作用。如果
extern“C”enum
与普通
enum
(在函数参数或模板参数中使用时)的损坏不同,或者
extern“C”的调用约定不同,这仍然可能会导致问题enum
s等@Justin它仍然是需要由
extern“C”
保护的函数,而不是enum声明。没有
extern“C”enum
这样的东西。enum是在
extern“C”
块内部还是外部声明都没有区别。