是的,我有一个想法(嘿,对不起,你问):请不要这样写代码。好的,我会保留正确的方式来做到最后。但是,就你的问题而言:是的,如果你同时使用C和C++编译器作为构建过程的一部分,这将导致ODR违规。实际的文件扩展名可能不相关(它可能会改变编译器的默认值,但是您的编译系统可能会明确指定编译器的语言)。也就是说,这是一个非常糟糕的想法,并且非常不寻常,因为C离C++的真正子集非常近,所以简单编写也可以用C++编译器编译的C代码会更加普遍。在同时拥有C和C++组件的项目中,您可以使用C++编译器,而在纯C项目中,您仍然可以使用该代码。所以,不管文件扩展名是什么,只要给定的项目只支持一个编译器就没有问题。
// my_header.h
#ifdef __cplusplus
constexpr bool is_cpp = true;
#else
constexpr bool is_cpp = false;
#endif
struct cpp {
std::size_t member;
int surprise;
};
struct cc {
unsigned member;
};
template <bool CPP>
struct MyStructImpl : private std::conditional_t<cpp, cc, CPP>
{
};
using MyStruct = MyStructImpl<is_cpp>;
这使得在结构中的代码量可能被定义以同样的方式和无条件不管宏选项,并按照相关的东西,以尽可能晚的宏。这在工具和测试方面也是一个巨大的胜利,例如您可以在不重新编译的情况下为两个版本的结构运行单元测试。
一点都不,只要你记得只在CPP编译器中使用'surprise',你应该没问题。只有其中一个条件将被编译,因此编译器将永远不会看到它。 –
@GillBates我正在做的项目有C和C++源文件(都使用了编译器)。哦,那么你的意思是说有2个连接器,所以没有问题? –
C++实际上是否在指定使用其他语言编写程序的某些部分时会发生什么?或者这只是未定义的? – Leushenko