Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何处理c++;预处理器宏?_C++_Arrays_Macros_Preprocessor Directive - Fatal编程技术网

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, *); 
}