我该如何在shell脚本中共享C头文件?
该shell脚本通过命名管道与C程序通信。假设枚举类型SAMPLE_ONE在C头文件中定义,并被C程序写入到管道中。然后,shell脚本从管道中读取枚举类型的值。有没有一种方法,可以让C程序和shell脚本之间共享头文件,只需更新一次头文件,而不必在shell脚本中编写相同的头文件常量?
我该如何在shell脚本中共享C头文件?
该shell脚本通过命名管道与C程序通信。假设枚举类型SAMPLE_ONE在C头文件中定义,并被C程序写入到管道中。然后,shell脚本从管道中读取枚举类型的值。有没有一种方法,可以让C程序和shell脚本之间共享头文件,只需更新一次头文件,而不必在shell脚本中编写相同的头文件常量?
$ 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
将配置数据写入单独的配置文件可能是更好的方法。 例如,您可以使用“Java属性”格式:
key=value
key2=value2
使用C语言解析这个文件应该并不难,而在shell中解析也很容易(source config.cfg)。您还可以生成一个带有#define的头文件。
我的观点是,如果您需要找到不同系统的通用格式作为源,则应尽量使用最简单的格式。解析C预处理指令绝对不是那么简单的。虽然您可能会认为"#define PORT 1234"直接映射到属性格式中的"port=1234",但您可能会发现"*#define PORT BASE_PORT+1*",这将不易于使用简单脚本正确地导出到shell。