我希望在某个代码点检查某个标识符
我需要这种类型的检查适用于不同类型的标识符 - 变量、枚举常量、函数、类型、宏等。但首先我至少要检查变量和函数。
我需要这样一种检查(例如想象中的
x
是否被声明,我该如何做?我需要这种类型的检查适用于不同类型的标识符 - 变量、枚举常量、函数、类型、宏等。但首先我至少要检查变量和函数。
我需要这样一种检查(例如想象中的
declared(x)
),以便下面的代码可以正常工作,例如对于 int 变量 x
的情况:if constexpr(declared(x)) {
int y = x + 1;
} else {
std::cout << "Variable 'x' not declared!" << std::endl;
}
对于宏的情况,我可以使用#ifdef x
,但是如何为变量和函数执行相同的检查?
对于全局非lambda函数的情况,我想出了下面的代码,基于重载函数解析,但需要使用基于辅助宏的全局定义(能否进一步简化?):
#include <iostream>
#include <type_traits>
#define declared_func_helper(x, ...) \
struct NotDeclared; \
template <typename ... Args> \
NotDeclared x(Args ...); \
template <typename ... Args> \
inline constexpr bool declared_func_##x(Args && ... args) { \
return !std::is_same_v<decltype(x(args...)), NotDeclared>; \
}
// declare some of functions
//void f(int a) {}
void g(bool b, char c) {}
// define helpers before or after declared functions
declared_func_helper(f);
declared_func_helper(g);
int main() {
// check declaration of functions
std::cout << "func 'f' declared: " << std::boolalpha << declared_func_f(int()) << std::endl;
std::cout << "func 'g' declared: " << std::boolalpha << declared_func_g(bool(), char()) << std::endl;
}
输出结果如下:
func 'f' declared: false
func 'g' declared: true
对于非全局变量的情况,我实现了下面的代码,但它还需要通过宏定义来定义辅助函数:
#include <type_traits>
#include <iostream>
#define declared_var_helper(x) \
struct NotDeclared_##x {}; \
NotDeclared_##x x;
#define declared_var(x) \
([&](){ return !std::is_same_v<decltype(x), NotDeclared_##x>; }())
// use helpers before variables declaration
declared_var_helper(x);
declared_var_helper(y);
int main() {
// declare some of variables
//bool x = false;
int y = 0;
// ........
// later check declaration
constexpr bool is_declared_x = declared_var(x), is_declared_y = declared_var(y);
std::cout << std::boolalpha << "var 'x' declared: " << is_declared_x << std::endl;
std::cout << "var 'y' declared: " << is_declared_y << std::endl;
}
输出结果为:
var 'x' declared: false
var 'y' declared: true
其他情况怎么办?或者有更简单的检查方法吗?
x
没有被声明,那么你无法成功编译一个引用了它的名称的程序。 - 500 - Internal Server Errorx
的情况下成功编译。基本上因为定义了类型为NotDeclared的全局变量,所以代码编译通过,但是该块不会被执行,因为没有这样的局部变量。我用这种方式解决了局部变量的问题! - Arty