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

3

我该如何在shell脚本中共享C头文件?

该shell脚本通过命名管道与C程序通信。假设枚举类型SAMPLE_ONE在C头文件中定义,并被C程序写入到管道中。然后,shell脚本从管道中读取枚举类型的值。有没有一种方法,可以让C程序和shell脚本之间共享头文件,只需更新一次头文件,而不必在shell脚本中编写相同的头文件常量?


3
也许你想要一个包含常量的文件,这样你就可以在你的 Shell 脚本和 C 程序中解析该文件。 - Vaughn Cato
我怀疑你可以利用一些可怕的黑客技巧,基于这样一个属性:C看到的预处理器指令,在bash看来则是注释。 - Wug
1
XY 问题的经典案例。 - Randy Howard
2个回答

2
请看下面的例子:
$ cat foo.h
#if 0
    shopt -s expand_aliases
    alias ENUM='true'
    alias COMMA=
#else
#   define ENUM  enum
#   define COMMA ,
#endif

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

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

2

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

key=value
key2=value2

使用C语言解析这个文件应该并不难,而在shell中解析也很容易(source config.cfg)。您还可以生成一个带有#define的头文件。

我的观点是,如果您需要找到不同系统的通用格式作为源,则应尽量使用最简单的格式。解析C预处理指令绝对不是那么简单的。虽然您可能会认为"#define PORT 1234"直接映射到属性格式中的"port=1234",但您可能会发现"*#define PORT BASE_PORT+1*",这将不易于使用简单脚本正确地导出到shell。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接