C++ 如何处理c++;预处理器宏?
对于家庭作业,我们被要求编写一个对数组元素求和的预处理器宏 我的问题是,如何处理宏中的数组元素,使其可以扩展为和(或对元素进行任何其他数学运算) 我们的书中没有提到处理数组元素,甚至没有提到访问数组元素,我在网上也找不到很多有用的资源,因为宏并不是处理类似问题的典型方法。我知道有更好的方法来做这样的事情,但我知道这个想法是为了让我们更好地熟悉预处理器宏C++ 如何处理c++;预处理器宏?,c++,arrays,macros,preprocessor-directive,C++,Arrays,Macros,Preprocessor Directive,对于家庭作业,我们被要求编写一个对数组元素求和的预处理器宏 我的问题是,如何处理宏中的数组元素,使其可以扩展为和(或对元素进行任何其他数学运算) 我们的书中没有提到处理数组元素,甚至没有提到访问数组元素,我在网上也找不到很多有用的资源,因为宏并不是处理类似问题的典型方法。我知道有更好的方法来做这样的事情,但我知道这个想法是为了让我们更好地熟悉预处理器宏 当我开始以函数的形式编写宏时,我不知道如何将总和“返回”到程序中。我能想到的唯一让宏展开为和的方法是,如果它是递归完成的,我甚至不确定是否可以使
当我开始以函数的形式编写宏时,我不知道如何将总和“返回”到程序中。我能想到的唯一让宏展开为和的方法是,如果它是递归完成的,我甚至不确定是否可以使用宏递归。我已经编写了一个宏,它成功地扩展到了数组的大小,但我不确定从那里开始应该向哪个方向扩展。下面是使用c++14的答案:
#include <array>
#include <iostream>
#include <numeric>
#include <type_traits>
#include <vector>
#define SUM(ARY) \
std::accumulate( \
std::begin(ARY), \
std::end(ARY), \
std::remove_reference_t<decltype(ARY[0])>{})
int
main()
{
auto ary1 = std::array< int, 5 >{1,2,3,4,5};
std::cout << SUM(ary1) << "\n";
int ary2[] = {1,2,3,4,5};
std::cout << SUM(ary2) << "\n";
auto ary3 = std::vector< int >{1, 2, 3, 4, 5};
std::cout << SUM(ary3) << "\n";
double ary4[] = {1.1,2.2,3.3,4.4,5.5};
std::cout << SUM(ary4) << "\n";
}
但是使用函数而不是宏更符合现代C++的精神。
#include <array>
#include <iostream>
#include <numeric>
#include <vector>
template< typename Ary >
auto sum(Ary const & ary)
{
return std::accumulate(
std::begin(ary),
std::end(ary),
decltype(ary[0]){});
}
int
main()
{
auto ary1 = std::array< int, 5 >{1,2,3,4,5};
std::cout << sum(ary1) << "\n";
int ary2[] = {1,2,3,4,5};
std::cout << sum(ary2) << "\n";
auto ary3 = std::vector< int >{1, 2, 3, 4, 5};
std::cout << sum(ary3) << "\n";
double ary4[] = {1.1,2.2,3.3,4.4,5.5};
std::cout << sum(ary4) << "\n";
}
#包括
#包括
#包括
#包括
模板
自动求和(常数和常数)
{
返回标准::累积(
标准::开始(ary),
标准::结束(ary),
decltype(ary[0]){};
}
int
main()
{
autoary1=std::array{1,2,3,4,5};
std::cout预处理器本质上做了很多查找和替换操作。它没有任何真正高级的功能,当然也不知道数组是什么。我可以想象,这个任务要求您编写一些内联代码来求数组或其他东西的和,然后为它创建一个宏
#define fold(array, ln, acc, op) \
for(size_t i = 0; i < ln; ++i) \
acc = acc op array[i];
int main(){
int ar[10];
int sum = 0;
fold(ar, 10, sum, *);
}
#定义折叠(数组、ln、acc、op)\
对于(尺寸i=0;i
此代码使用*
操作折叠数组。C++或C?它们是非常不同的语言,具有非常不同的编程习惯和技术。请记住,您可以编写函数并在宏中调用函数。这是高中还是大学级别的“C课程”我可以肯定地说,在实际C或C++中,没有什么有用的东西,可以通过编写这样的宏来学习编程技巧。用STORM表达式来完成这些操作将比宏更好。这有帮助吗?而不是假设容器不是空的,可以使用操作符的标识值。这并不完全是他在作业中想要的,但我能够利用从您的解决方案中学到的知识使我的工作起来。谢谢!我不知道您可以在宏中使用运算符作为参数。这很有趣,这可能是一件有用的事情。
#define fold(array, ln, acc, op) \
for(size_t i = 0; i < ln; ++i) \
acc = acc op array[i];
int main(){
int ar[10];
int sum = 0;
fold(ar, 10, sum, *);
}