2

C ヘッダー ファイルをシェル スクリプトと共有するにはどうすればよいですか?

シェル スクリプトは、名前付きパイプを介して C プログラムと通信します。Cヘッダーファイルで定義されているenum SAMPLE_ONEがCプログラムによってパイプに書き込まれたとします。シェル スクリプトは、パイプから列挙型の値を読み取ります。C プログラムとシェル スクリプトの間でヘッダー ファイルを共有する方法はありますか? ヘッダー ファイルを 1 回更新するだけで、シェル スクリプトに同じヘッダー定数を書き込む必要がないようにするにはどうすればよいでしょうか?

4

2 に答える 2

1

別の構成ファイルに構成データを書き込むことは、より良いアプローチである可能性があります。たとえば、「Javaプロパティ」形式を使用できます。

key=value
key2=value2

Cを使用すると、解析はそれほど難しくなく、シェルを使用して解析するのは簡単です(ソースconfig.cfg)。このファイルから#definesを含むヘッダーファイルを生成することもできます。

私のポイントは、さまざまなシステムのソースとして共通の形式を見つける必要がある場合は、最も単純な形式を試して使用する必要があるということです。Cプリプロセッサディレクティブの解析は、それほど単純ではありません。「#definePORT1234」は、プロパティ形式で「port = 1234」に直接マップされると思われるかもしれませんが、「*#define PORT BASE_PORT + 1 *」は、簡単に適切にエクスポートされない可能性があります。単純なスクリプトを使用したシェル。

于 2013-03-24T00:28:19.810 に答える
1

次の例を参照してください。

$ cat foo.h
#define ENUM  enum
#define COMMA ,

ENUM foo_t
{
    FOO_VALUE1=11 COMMA
    FOO_VALUE2=22 COMMA
    FOO_VALUE3=33
};

C ファイルで使用するには:

$ cat foo.c
#include <stdio.h>
#include "foo.h"

#define print_enum(x) printf("%s=%d\n", #x, x)

int main()
{
    enum foo_t foo = FOO_VALUE1;

    print_enum(FOO_VALUE1);
    print_enum(FOO_VALUE2);
    print_enum(FOO_VALUE3);

    return 0;
}

シェル スクリプトで使用するには:

$ cat foo.sh
#!/bin/bash

shopt -s expand_aliases
alias ENUM='true'
alias COMMA=

source foo.h

enum_names=( ${!FOO_*} )
for name in ${enum_names[@]}; do
    echo $name=${!name}
done

テストしてみましょう:

$ gcc foo.c
$ ./a.out
FOO_VALUE1=11
FOO_VALUE2=22
FOO_VALUE3=33
$ bash foo.sh
FOO_VALUE1=11
FOO_VALUE2=22
FOO_VALUE3=33
$
于 2013-03-21T02:44:16.117 に答える