2011-08-09 28 views

回答

11

這不是必需的,但#define的範圍在定義該行後是全局的。如果你認爲它會的話,它不會服從功能範圍。

+2

您是否閱讀過警告? 'prog.cpp:14:1:警告: 「somevariable」 redefined' –

+0

如果我有'#定義一個printf( 「測試」)''中func',我永遠不能調用'一個;'中的任何其他功能。所以這不是全球性的。 – lexer

+3

@lexer在這裏看到:http://ideone.com/ULYYp請注意,我甚至不會調用bar(),還要注意我可以在'#define'之前使用名爲'a'的變量。 –

1

這取決於。只有當你想確保a將不會在你的程序的後續點可能可用時,這取決於你的邏輯。 define現在是全球性的(在當前的翻譯部門)!

gnu.org

如果宏不再是有用的,它可以與`和#undef」 指令是未定義的。

此外,

一旦宏已未定義,該標識符可被重新定義爲 宏通過隨後的`的#define」指令。新定義不需要 與舊定義有任何相似之處。

然而,如果一個標識符這是目前的宏被重新定義,然後 新定義必須是有效的一樣舊的。 兩個宏定義在以下情況下實際上是相同的:

  • 兩者都是相同類型的宏(對象或函數)。
  • 替換列表中的所有標記都是相同的。
  • 如果有任何參數,它們是相同的。
  • 空白出現在兩個相同的地方。儘管如此,它不一定是 完全相同數量的空白的 。請記住,評論計爲 空白。
+0

但它從來沒有提供其他任何地方,除了本身。 – lexer

+0

@lexer:什麼程序?我從來沒有說過其他*程序。 – 2011-08-09 19:09:26

+0

@lexer :(編輯完成後)然後#undef它。它是由你決定。 – 2011-08-09 19:09:59

3

這不是必要。如果宏僅用於函數內部,那麼它可能是一個好主意。如果你不這樣做,那隻意味着宏通過其餘的翻譯單元(源文件)保持可見。

無論如何,大多數宏可能是在整個源文件中都可見的,所以通常這個問題不會出現。

1

當我聲明一個宏,就像你在一個函數體內做的那樣,然後我會在最後執行它。因爲大多數情況下它只適用於該功能體。

一般來說,當您知道宏定義不會隨後被使用時,因爲宏定義傳播到包含具有宏的文件的所有其他文件,所以對於#undef宏總是一個好主意。

相關問題