2011-12-27 89 views
0

我不確定是否可以以這種方式使用宏。使用字符串檢查宏定義

在我的嵌入式系統項目中,我想知道是否定義了一個宏,這取決於我擁有的兩個字符串。

對於如:

#define FAN_1 PORTAbits.RA0 

#define LIGHT_1 PORTAbits.RA1 

現在,當我得到的形式提出的請求:

char *arg1="FAN"; ("LIGHT") 

char *arg2="1"; 

使用這兩種說法我想直接檢查針,我的風扇1附加並檢查其狀態。

我想要一種方法,以便我不必使用strcmp()或直接匹配來檢查arg1和arg2。 而我可以直接寫if(some_macro(arg1,arg2)==1){} else {}

請指導,如果這是可能的使用宏,因爲引腳只能這樣定義。

另外,如果沒有,那麼是否有任何其他方式來做到這一點?

+0

這看起來很像微型芯片PIC代碼。如果您使用的是MPLAB C編譯器和庫,請注意RAM與ROM中的字符串之間的區別。傳遞給函數的字符串常量將由'char rom *'而不是'char *'進行傳遞。對於每種類型的字符串比較,它們的庫中都有特殊的函數。例如:'strcmppgm2ram(arg1,「FAN」)'將arg1與字符串文字進行比較是正確的。我不確定其他C編譯器如何處理奇怪的內存結構。 – 2011-12-27 19:52:18

回答

4

不,宏不能像這樣使用。宏是一個預處理器功能,它在編譯代碼之前被預處理器擴展。這聽起來像你收到的請求只在運行時才知道。如果此信息僅在運行時已知,則無法在預處理器時間檢查請求是針對FAN_1還是LIGHT_1。您需要使用條件檢查來確定請求的用途。

根據引腳存儲庫的名稱(「FAN」,「LIGHT」等),僅打開arg1的第一個字符或可能是前幾個字符就足夠了。另外,也可以將arg2完全解析爲整數,而不是將其切換爲字符。這將允許您識別正在請求的引腳而無需致電strcmp()atoi()

+0

以更全面的答案+1擊敗我8秒。 – 2011-12-27 12:09:26

+0

謝謝Daniel!我不能在arg1的第一個字符處切換,因爲我還需要驗證請求是被接受還是被拒絕。爲此我必須檢查拼寫完整的「粉絲」和「光明」你對arg2是正確的。 – user1117564 2011-12-27 12:17:41

1

C預處理器無法訪問任何變量的值。但是你可以使用環境變量,而不是宏:

putenv("FAN_1", "PORTAbits.RA0") 
putenv("LIGHT_1", "PORTAbits.RA1") 

然後:

if (getenv(construct(arg1, arg2)) != NULL) {} else {} 

construct(arg1, arg2)函數返回一個字符串arg1"_"arg2的級聯。

+0

'construct'在這種情況下可能會泄漏內存。 – 2011-12-27 12:30:09

+3

他可能在PIC上沒有putenv()或getenv():)。 – 2011-12-27 16:32:59

+0

右布賴恩..我沒有這樣的方法。你能建議任何其他方式來做到這一點嗎? – user1117564 2012-01-06 17:19:17