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