在使用常量时,上面的两个答案是正确的,但#define
不限于单独使用。使用#define
的另一个示例是宏。
宏
宏是代码的预处理,利用片,他们的工作完全一样在这方面其他#define
声明。预处理器将用宏的代码从字面上替换已定义符号的出现。举个例子:
#define HELLO_MAC do{ std::cout << "Hello World" << std::endl; }while(false)
int main(int argc, char** argv)
{
HELLO_MAC;
}
这将字面上我宣布码掉出HELLO_MAC
符号。如果它是一个常数,它会做同样的事情。所以你可以把#define
作为一个特殊的宏来考虑。
使用宏,你也可以传递参数,这对于通过代码实施日志/异常策略非常有用。 例如
#define THROW_EXCEPT(ex_type, ex_msg)/
do{ throw ex_type(buildExString((ex_msg), __LINE__, __FILE__)); }while(false)
...
// somewhere else
THROW_EXCEPT(std::runtime_error, "Unsupported operation in current state");
该代码可以让我以确保每个人都与抛出异常的文件的行日志。
模板往往是一个更好的选择,而不是宏,而是因为我需要使用__LINE__
和__FILE__
功能从废弃的地方,而不是从模板函数的位置,我不能使用模板函数的这个例子。
你应该在哪里不使用宏?任何地方你可以使用别的东西。与任何#define
一样,宏也被预处理,所以编译器根本看不到它们。这意味着从来没有为HELLO_MAC
或THROW_EXCEPT
创建任何符号,因此无法在调试器中看到它们。如果你得到编译错误,他们也会感到困惑,特别是如果它们是长宏的话。
浏览此主题。最佳答案从那里 - '#define's'不尊重范围 - http://stackoverflow.com/questions/1944041/advantage-and-disadvantages-of-defines-vs-constants – 2013-03-05 08:14:07