2016-11-24 86 views
0

是否可以編寫腳本來針對不同的A值運行此代碼;使用Shell腳本在C程序中更改某些東西

#include <stdio.h> 
#define A 3 

int main(){ 

    printf("In this version A = %d\n", A); 
    return(0); 
} 

我想爲循環?

+0

使用sed,將輸出輸出到cc,然後執行cc生成的內容。 – nicomp

+0

我認爲這是對你真正想要做的事情的簡化;也許如果你解釋了那是什麼,你可能會得到更有幫助的答案。 –

+0

這是[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你真的想做什麼? –

回答

1

是否可以編寫一個腳本來運行此代碼以獲取不同的A值;

並非如此,因爲宏A在您的代碼中定義了一個固定值。相反,可以通過值作爲參數:

#include <stdio.h> 

int main(int argc, char **argv){ 
    if(argc == 2) { 
     printf("In this version A = %s\n", argv[1]); 
    } 
    return 0; 
} 

(代碼不檢查其輸入是一個整數 - 這在需要時可以進行測試)。

你可以通過腳本來運行它。例如,使用一個循環for的bash編譯上面(gcc -Wall -Wextra test.c -o test):

$ for ((i = 0; i < 10; i++)); do ./test $i; done 
In this version A = 0 
In this version A = 1 
In this version A = 2 
In this version A = 3 
In this version A = 4 
In this version A = 5 
In this version A = 6 
In this version A = 7 
In this version A = 8 
In this version A = 9 
$ 
-2

您是否需要從腳本中重複運行程序?爲什麼不讓程序接受來自命令行的參數? 1)main()函數實際上需要參數,你可以編譯一次程序並傳遞不同的參數,如上面的回答所示 2)如果你需要從make腳本改變一些代碼參數,我會說,創建單獨的頭文件,其中包含定義和寫入腳本,該腳本將回應該文件(>開始,>>繼續寫入)。 3)另一種方法,你可以調用你的編譯器的標誌,將等於#define宏命令。對於gcc,它是-D,例如-DA = 3而不是#define A 3.

大多數程序使用makefile進行編譯。對於這種情況,您可以使用腳本make file來使用2)或3)前者更好,因爲您不需要將該參數傳遞給全部編譯目標,從而減少時間或重新編譯。有更多高級操作的工具,比如autoconf。

+3

對於那些被認爲是答案的東西,這是很多問題。 –

+0

你不能回答XY問題沒有問題 – Swift

+1

這解釋了爲什麼你沒有。 –

0

不可以,但可以使一個命令行參數:

#include <stdio.h> 

int main (int argc, char *argv[]) { 
    int a; 
    if (argc != 2 || sscanf(argv[1], "%d", &a) != 1) return 1; 
    printf("In this version A = %d\n", a); 
    return 0; 
} 

編譯到名爲foo二進制,然後

foo 42 

將打印

In this version A = 42 

您也可以通過在編譯命令行中定義A編譯不同的版本。從您的原始程序中刪除#define。然後

gcc -DA=42 foo.c -o foo 
./foo 

將打印與上面相同。