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

Posted

技术标签:

【中文标题】在 C 程序和 shell 脚本之间共享头文件【英文标题】:Sharing header file between a C program and a shell script 【发布时间】:2013-03-21 02:13:09 【问题描述】:

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

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

【问题讨论】:

也许你想要一个包含你的常量的文件,然后你可以在你的shell脚本和你的C程序中解析那个文件。 我怀疑你可以利用一些可怕的 hack,基于 C 视为预处理器指令的属性,bash 将视为 cmets。 XY 问题的经典案例。 【参考方案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
$

【讨论】:

【参考方案2】:

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

key=value
key2=value2

使用 C 应该不会很难解析,而使用 shell 解析它是微不足道的(source config.cfg)。您还可以从此文件生成带有#defines 的头文件。

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

【讨论】:

以上是关于在 C 程序和 shell 脚本之间共享头文件的主要内容,如果未能解决你的问题,请参考以下文章

如何调试用GDB执行bash shell脚本的C程序?

Code::Blocks 中的头文件和源文件问题

C语言里面的这个#include <stdio.h>啥意思啊?

Shell脚本——make命令和Makefile文件

c 中conio.h是啥头文件?c++中能用吗

是否可以在 Windows 中的 PHP 和 C 之间共享内存?