2016-11-06 63 views
2

是否有可能在同一時間分配相同的值,兩個C預處理宏?它會表現得與此類似普通的C代碼:同一命令分配兩個C預處理變量

a = b = 1; 

我知道你可以這樣做:

#define VAR1 1 
#define VAR2 1 

但是,這有點痛的,只是因爲現在有代碼複製,並有更多的機會胡來向上。這是唯一的解決方案嗎?

#define VAR1 1 
#define VAR2 VAR1 

編輯:由於各種評論人士指出,預處理器宏,不變量。對於那個很抱歉。

+10

C預處理器沒有變量 –

+1

'#define'定義了宏。他們不是變數。對於常量來說,使用'static const int VAR1 = 1;'或者類似的東西通常會更好。它增加了類型安全性,而優化編譯器應該能夠生成同樣好的代碼。 – hyde

+1

你的第二個解決方案看起來很合理。你的問題是什麼? –

回答

2

ISO C標準沒有描述其分配相同的替換序列到多個符號的任何預處理指令。即這樣的事情並不在標準的存在:

// fantasy syntax: 
#definemulti (A B C) replacement token sequence 

由於更換序列可包含多個標記,就必須要麼必須括號的地方,或者一些其他的方式來告訴其中姓名結束,並且替換順序。

在28年的C編碼中,我還沒有看到任何需要帶有這種擴展的編譯器的任何代碼片段。即使您發現一個編譯器將其作爲擴展名,使用它的不可移植性也很難值得。

這種引入的語言可能會面臨很多障礙,因爲它節省打字只是一個小數目。

此外,我們可以做一個技術這種說法是錯誤的。

說我們有一些編譯時間參數— ABC —調整代碼的行爲。它們碰巧具有相同的值,所以我們將它們定義在一行中。

如果後它們不再具有相同的值,程序有要編輯到不同的值分裂成單獨#define構建體。例如,從這樣的:

#definemulti (A B C) 1 

這個

#definemulti (A C) 1 
#define B 2 

這導致線DIFF其中涉及AC。整個definemulti線更換爲新的,因爲B遷移出來。在一個GNU風格的背景差異,這種變化可能會類似於以下內容:

@@ -x, y +z, w @@ 
... 
-#define (A B C) 1 
+#define (A C) 1 
+#define B 2 
... 

而如果,首先,我們有:

#define A 1 
#define B 1 
#define C 1 

的差異大塊是更好的,就像這樣:

@@ -x, y +z, w @@ 
... 
#define A 1 
-#define B 1 
+#define B 2 
#define C 1 
... 

一目瞭然,我們可以看到,AC不受影響,而且B改爲2

我們還應該考慮爲什麼我們有lval0 = lval1 = lval2 = ... = val這種形式的賦值表達式。一個重要的原因是val只評估一次。由於評估順序的變化以及c的多次評估,因此表達式a = b = c不能總是被重寫爲a = c, b = c

0

看着preprocessor syntax,它似乎沒有一種標準的方法來將兩個宏設置在一起。該語法只允許將一個令牌更改爲一個或多個替換令牌,並且不允許使用任何操作符鏈接。

由於預處理程序指令必須以換行符結尾,因此也不可能在同一行中放入兩個指令。也沒有digraphs or trigraphs在預處理器開始運行之前注入換行符(由許多先前的SO回答確認)。

0

如果我可以外推,它看起來像你想要兩個構建配置宏,但通常他們應該有相同的值。

一個解決辦法是,以詳細說明你的最後一個代碼一點,

#define VAR1 1   /* May be from a configuration file or makefile. */ 

/* In the proper source: */ 
#ifndef VAR2   /* If some configuration is still missing, */ 
# define VAR2 VAR1 /* fill in the blank. */ 
#endif 

現在,如果你決定定義VAR2的配置,它會取消默認設置裏面ifndef