如何與shell腳本共享C頭文件?在C程序和shell腳本之間共享頭文件
shell腳本通過命名管道與C程序進行通信。讓我們假設在C頭文件中定義的枚舉SAMPLE_ONE被C程序寫入管道。 shell腳本從管道讀出枚舉的值。有沒有辦法在C程序和shell腳本之間共享頭文件 - 這樣我只需要更新一次頭文件,而不必在shell腳本中編寫相同的頭常量?
如何與shell腳本共享C頭文件?在C程序和shell腳本之間共享頭文件
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
};
$ 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;
}
$ 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
$
關閉,但完成工作。 – JRIyer 2013-04-03 10:25:47
在單獨的配置文件中寫入配置數據可能是一個更好的辦法。 例如,你可以使用一個「Java屬性」格式:
key=value
key2=value2
用C應該不是很困難的解析,並用殼解析實在是小巫見大巫(源的config.cfg)。你也可以用這個文件中的#define生成一個頭文件。
我的觀點是,如果你需要找到一個通用的格式作爲不同系統的來源,你應該嘗試使用最簡單的格式。解析C預處理指令絕對不是那麼簡單。鑑於您可能會認爲「#定義端口1234」在屬性格式中直接映射到「端口= 1234」,您可能會發現「* #define PORT BASE_PORT + 1 *」,這不會很容易正確用簡單的腳本導出到shell。
也許你想要的是讓一個文件包含你的常量,然後你可以在你的shell腳本和你的C程序中解析這個文件。 – 2013-03-21 02:15:29
我懷疑你可以利用一些可怕的黑客攻擊,根據C認爲是預處理器指令的屬性,bash會將其視爲註釋。 – Wug 2013-03-21 02:18:45
XY問題的經典案例。 – 2013-03-21 03:37:24