2013-03-21 83 views
1

如何與shell腳本共享C頭文件?在C程序和shell腳本之間共享頭文件

shell腳本通過命名管道與C程序進行通信。讓我們假設在C頭文件中定義的枚舉SAMPLE_ONE被C程序寫入管道。 shell腳本從管道讀出枚舉的值。有沒有辦法在C程序和shell腳本之間共享頭文件 - 這樣我只需要更新一次頭文件,而不必在shell腳本中編寫相同的頭常量?

+3

也許你想要的是讓一個文件包含你的常量,然後你可以在你的shell腳本和你的C程序中解析這個文件。 – 2013-03-21 02:15:29

+0

我懷疑你可以利用一些可怕的黑客攻擊,根據C認爲是預處理器指令的屬性,bash會將其視爲註釋。 – Wug 2013-03-21 02:18:45

+0

XY問題的經典案例。 – 2013-03-21 03:37:24

回答

1

見下面的例子:

$ 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 
$ 
+0

關閉,但完成工作。 – JRIyer 2013-04-03 10:25:47

0

在單獨的配置文件中寫入配置數據可能是一個更好的辦法。 例如,你可以使用一個「Java屬性」格式:

key=value 
key2=value2 

用C應該不是很困難的解析,並用殼解析實在是小巫見大巫(源的config.cfg)。你也可以用這個文件中的#define生成一個頭文件。

我的觀點是,如果你需要找到一個通用的格式作爲不同系統的來源,你應該嘗試使用最簡單的格式。解析C預處理指令絕對不是那麼簡單。鑑於您可能會認爲「#定義端口1234」在屬性格式中直接映射到「端口= 1234」,您可能會發現「* #define PORT BASE_PORT + 1 *」,這不會很容易正確用簡單的腳本導出到shell。