1. ホーム
  2. c++

C言語での.hファイルの異常な使用について

2023-08-24 01:27:43

質問

フィルタリングに関する記事を読んでいて、いくつかの奇妙な使い方を発見しました。 .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 は、単に テキスト を置換しているだけです (GNUの cpp 内部 GCC ). コメントと文字列リテラルの外側の)どの場所でも発生することができます。

しかし #include は、その # をその行の最初の空白でない文字とする必要があります。ですから、次のようなコードになります。

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

元の質問には #include を付けていなかったので、間違ったコードになっていました。

これは 通常 を実践していますが、それは 許可されている の練習をする必要があります。そのような場合には、他の拡張子を使うことをお勧めします。 .h を使用します。 #include "f1.def" または #include "f1.data" ...

コンパイラに前処理されたフォームを表示するように依頼します。とともに GCC でコンパイルします。 gcc -C -E -Wall yoursource.c > yoursource.i でコンパイルし、エディタやページャーで生成された yoursource.i

私は実際、そのようなデータはそれ自身のソースファイルにある方が好きです。ですから、私は代わりに自己完結型の h-data.c ファイルを生成することをお勧めします。 GNU awk (ですから、ファイル h-data.c で始まる場合 const float h[345] = { で始まり }; ...) そして、もしそれが定数データであるなら、よりよくそれを宣言してください const float h[] (のような読み取り専用のセグメントに置くことができます。 .rodata のような読み取り専用セグメントに置くことができます)。また、埋め込みデータが大きい場合、コンパイラは(無駄に)最適化するのに時間がかかるかもしれません(その場合、あなたのコンパイルした h-data.c を最適化せずに素早くコンパイルすることができます)。