C ++检测是否声明了全局变量

时间:2019-03-01 19:39:13

标签: c++

是否可以使用boost has_member之类的SFINAE或其他符合C ++标准的方法来检查是否在全局范围内声明了特定变量?
这意味着无需事先声明宏即可进行检查,也无需使用编译器特定的添加项,例如MSVC的__if_exists。像弱符号声明一样的GCC也不可行。

使用C ++ 11或更早版本的解决方案对我来说是完美的。也欢迎其他解决方案。

P.S .:可以假定变量的类型是已知的。

背景:
我目前正在尝试以通用方式针对许多不同的Arduino平台。我知道特殊引脚被声明为static const uint8_t,但是我不知道是否声明了SDA1或仅声明了SDA。为了支持较新的目标,而无需每次都编写新的电路板定义,我想检查给定的一组可能的引脚,并在声明时提供支持。 Arduino IDE可以立即使用,因此不应该使用编译器特定的功能,额外的程序或其他奇特的功能。我知道,对于大多数这些变量,还声明了一个宏,用于指示存在的那些宏。不过,在我看来,更干净的解决方案是直接检查是否声明了pin变量,因为宏名称倾向于特定于目标,而pin变量名称和声明看起来很稳定。当然,正确的解决方案是确保命名约定和宏定义支持这种检查。但是,将这个想法推广到所有Arduino核心项目的工作对我来说实在是太多了。

P.P.S:请不要只是因为xy问题而对此投反对票或评论。我的例子只是众多例子之一。任何其他API(如多库目标项目)也可以使用这种解决方案。即使是明确的“不,这是不可能的”,也至少可以节省大量时间来寻找这种解决方案。

1 个答案:

答案 0 :(得分:2)

我认为您可以使用构建步骤来最好地解决此问题,例如配置脚本尝试使用有问题的全局变量来编译代码。然后,它可以确定构建是成功还是失败,并定义适当的makros来处理代码中有问题的案例。