在C程序和shell脚本之间共享头文件

时间:2013-03-21 02:13:09

标签: c bash shell header-files named-pipes

如何与shell脚本共享C头文件?

shell脚本通过命名管道与C程序通信。我们假设C程序文件中定义的枚举SAMPLE_ONE由C程序写入管道。 shell脚本从管道中读取枚举的值。有没有办法在C程序和shell脚本之间共享头文件 - 这样我只需要更新头文件一次而不必最终必须在shell脚本中编写相同的头常量?

2 个答案:

答案 0 :(得分: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;
}

在Shell脚本中使用:

$ 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
$

答案 1 :(得分:1)

将配置数据写入单独的配置文件可能是更好的方法。 例如,您可以使用“Java属性”格式:

key=value
key2=value2

使用C语言解析起来应该不是很困难,使用shell解析它是微不足道的( source config.cfg )。您还可以使用此文件中的#defines生成头文件。

我的观点是,如果您需要找到一个通用格式作为不同系统的源,您应该尝试使用最简单的格式。解析C预处理程序指令绝对不是那么简单。虽然您可能会认为“ #define PORT 1234 ”直接映射到属性格式的“port = 1234”,但您可以找到“* #define PORT BASE_PORT + 1 *”,其中使用简单的脚本无法轻松地将其正确导出到shell。