这个用于写出任何数组内容的宏是否 100% 安全? C++11
Is this macro for writing out any array content 100 % safe? c++11
我知道 C++ 没有很好的宏函数,但我发现了这个。
#define show(array) \
for (auto& x : (array)) \
std::cout << x << std::endl; \
我们不能用内联函数替代这个宏,因为数组被发送来充当指针,所以这是不可能的。
有了这个,即使我们尝试应用一些不雅的东西,它只会导致编译时错误(如果对象不可迭代),这是显而易见的一个:
'begin' was not declared in this scope: show(5);
那么我的问题 - 这绝对安全吗?它会导致创建 "bad situation" 吗?
您可以改为使用 100% C++ 模板函数,其中数组不会衰减为指针,方法是传递通过引用数组并推导出其大小和类型:
template<typename T, size_t N>
void print_arr(const T(&arr)[N])
{
for(auto&& elem: arr)
std::cout << elem;
}
宏很少是安全的,所以更喜欢使用(如果可以的话)适当的函数,它是类型检查等。
我知道 C++ 没有很好的宏函数,但我发现了这个。
#define show(array) \
for (auto& x : (array)) \
std::cout << x << std::endl; \
我们不能用内联函数替代这个宏,因为数组被发送来充当指针,所以这是不可能的。 有了这个,即使我们尝试应用一些不雅的东西,它只会导致编译时错误(如果对象不可迭代),这是显而易见的一个:
'begin' was not declared in this scope: show(5);
那么我的问题 - 这绝对安全吗?它会导致创建 "bad situation" 吗?
您可以改为使用 100% C++ 模板函数,其中数组不会衰减为指针,方法是传递通过引用数组并推导出其大小和类型:
template<typename T, size_t N>
void print_arr(const T(&arr)[N])
{
for(auto&& elem: arr)
std::cout << elem;
}
宏很少是安全的,所以更喜欢使用(如果可以的话)适当的函数,它是类型检查等。