在阅读有关过滤的文章时,我发现.h文件有一些奇怪的用法——用它填充系数数组:

#define N 100 // filter order
float h[N] = { #include "f1.h" }; //insert coefficients of filter
float x[N];
float y[N];

short my_FIR(short sample_data)
{
  float result = 0;

  for ( int i = N - 2 ; i >= 0 ; i-- )
  {
    x[i + 1] = x[i];
    y[i + 1] = y[i];
  }

  x[0] = (float)sample_data;

  for (int k = 0; k < N; k++)
  {
    result = result + x[k]*h[k];
  }
  y[0] = result;

  return ((short)result);
}

那么,这样使用float h[N] = { #include "f1.h" };是正常的做法吗?

推荐答案

#include这样的Preprocessor条指令只是做了textual个替换(参见GCC中GNUcpp的文档).它可以出现在任何地方(注释和字符串文本之外).

但是,#include应该将其#作为其行的第一个非空字符.所以你需要编码

float h[N] = {
  #include "f1.h"
};

原来的问题本身没有#include,所以代码错误

这不是normal次练习,而是permitted次练习.在这种情况下,我建议使用.h以外的扩展名,例如使用#include "f1.def"#include "f1.data"...

要求您的编译器向您显示预处理后的表单.用GCC编译用gcc -C -E -Wall yoursource.c > yoursource.i编译,并用编辑器或pager 查看生成的yoursource.i

实际上,我更喜欢将这些数据保存在自己的源文件中.因此,我建议使用诸如GNU awk之类的工具生成一个自包含的h-data.c文件(因此文件h-data.c将以const float h[345] = {开头,以};结尾…)

C++相关问答推荐

segfault在C中使用getline()函数

C指针算法在函数参数中的应用

如何在Visual Studio代码中关闭此函数名称显示功能?

当execvp在C函数中失败时杀死子进程

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

用C宏替换strncMP函数中的参数

错误:包含文件时类型名称未知

在Linux上使用vscode和lldb调试用Makefile编译的c代码

如何编写一个for循环来计算C中各项的总和?

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

GCC错误,共享内存未定义引用?

CS50判断灯泡运动的问题,判断时多出一个灯泡,但不在终端上

pthread_create的用法

为什么二进制文件的大小不会随着静态数据的大小而增加?

某些EAX值的不同调用方的CPUID结果不一致

try 查找带有指针的数组的最小值和最大值

使用mmap为N整数分配内存

如何找出C中分配在堆上的数组的大小?

添加/删除链表中的第一个元素

C 中从 Unix 纪元时间转换的损坏