2011-04-27 52 views
0

如果我有這樣的函數宏:是一個變量總是用變量或常量定義的宏嗎?

void SomeFunc(int arg1, int arg2) 
{ 
    float value1, value2; 
    float range; 

//#define MatrixBlock MyMatrix.block<arg1,arg2>(value1, value2) 
//#define BlockRange  MatrixBlock.block<arg2, range> 
    #define MatrixBlock MyMatrix.block(value1, value2, arg1, arg2) 
    #define BlockRange  MatrixBlock.block(value1, value2, 0, range) 

    /* My code using the above macros */ 

    // Are the following lines necessary? What will happen if I don't undefine the macro? 
#undef MatrixBlock 
#undef BlockRange 
} 

它會獲得新的ARG1和ARG2值每次還是會被固定在第一時間遇到宏?我需要#undef嗎?如果我沒有編譯器看到的代碼之前#undef小號

+0

你是什麼意思「每次」?這是否在你希望包含多次的頭文件中定義這個函數的不同版本?或者你是否希望每次調用函數時都實例化不同的模板(這是不可能的)?或者是其他東西? – 2011-04-27 14:22:04

+0

@Mike:對不起,我是從記憶中打字。那裏不應該使用模板。我已經註釋了錯誤的代碼並添加了正確的版本 – Samaursa 2011-04-27 15:50:54

回答

2

宏是隻是一個文本替換。

在你的代碼已經定義了換人,但從未付諸行動它們。你需要做這樣的事情:

void SomeFunc(int arg1, int arg2) { 
    float value1, value2; 
    float range; 
#define MatrixBlock MyMatrix.block<arg1,arg2>(value1, value2) 
#define BlockRange MatrixBlock.block<arg2, range>  

    MatrixBlock; // as if you had written MyMatrix.block<arg1,arg2>(value1, value2); in the code 
    BlockRange myRange; // as if you had written MatrixBlock.block<arg2, range> myRange; in the code 
/* My code using the above macros */ 
// Are the following lines necessary? What will happen if I don't undefine the macro? 

#undef MatrixBlock 
#undef BlockRange 
} 

所以,是的,你會得到每一個函數被調用時ARG1,ARG2,值1,值,範圍的電流值。我注意到你正在試圖用運行時間值專門化模板,我認爲這不會起作用。

如果你沒有undef這些宏,那麼它們將可用於所有define之後的代碼,因此一些後續的方法可以使用它們。如果這是在頭文件中,那麼包含它的任何東西都可以訪問這些宏。

這是不尋常的,方法中的定義,但不前所未聞的。

+0

+1實際回答問題「如果我沒有#undefs會發生什麼」 – davka 2011-04-27 14:21:57

+0

是的,你說得對錯。我從記憶中寫下了這個例子。實際的代碼是'MyMatrix.block(value1,value2,arg1,arg2)'。 – Samaursa 2011-04-27 15:47:41

1

宏作爲文本替換處理在一個單獨的傳球做會發生什麼。他們對功能和參數一無所知。

3

宏做文本替換,基本上是相同的,如果你會因此在文本編輯器的搜索和替換。其結果賦予C編譯器以解析和生成代碼。

該宏並不關心arg1arg2是什麼,它只是用字符串MyMatrix.block<arg1,arg2>(value1, value2)替換字符串MatrixBlock。結果如何解釋取決於編譯器。

+2

並且爲了完成這個答案:所有的宏共享相同的全局作用域,所以'#undef'可以通過限制宏標識符的範圍來幫助避免名稱衝突。 – 2011-04-27 14:18:59