我刚刚使用#define来更改我的值ex:
#include <iostream>
#include <string>
#define Changed_num 100
using namespace std;
int main ()
{
cout<< Changed_num<< endl;
}
但是我听说没有#define有更好的方法可以做到这一点(另一种方式是什么?)
所以我请问,为什么你需要#define呢?什么是最常见的用途?
答案 0 :(得分:3)
所示方案中#define
的C ++等价物为const
。内部#define
不是由编译器使用,而是由预编译器用于在实际发送到编译器之前修改代码。因此,在您的情况下,编译器实际上只能看到cout<<100<<endl;
。使用const
是更好的做法,因为它实际上是type safe。
C ++中#define
的最常见用例是include guards,以确保只为任何特定对象包含一次头文件。
亚军最有可能进行特定于平台的编译/优化,有关示例,请参阅this link。
答案 1 :(得分:2)
一般情况下:是的,您应该尽量避免使用#define
(请参阅C++ FAQ: Are you saying that the preprocessor is evil? )
原因是#define
由预处理器处理,这是在词汇级别(全局),所以你对#define
影响的控制替换不太好,可能会适得其反(例如,因为你包含了一个标题,其中包含一个包含#define
标题的标题导致代码行为不当或根本就不编译)。
你应该使用什么?
const int Changed_num=100
)变量或静态类属性。 (见:Why would I use a const variable / const identifier as opposed to #define? )。另请查看C ++ 11中的constexpr new关键字。何时仍应使用#define
答案 2 :(得分:1)
对于常量值,使用const int Changed_num = 100;
优于#define Changed_num 100
,因为您可以指定类型。例如,您可以const unsigned long Changed_num = 100
,声明为#define
有点棘手。 (你可以做#define Changed_num 100ul
之类的事情,但事情并不那么明显。)
#define
作为记录宏的一部分的一种可能用途,例如boost::log
。它们的优点是可以在它们被调用的位置插入__FILE__
和__LINE__
之类的内容。它们也用于代码生成,例如boost::foreach
(已被c++11
中的范围取代)或boost::python
。但是,一般情况下,您最好使用[模板化]功能,以便获得正确的类型安全性。
#define
的主要缺点是它是一把超级重锤。如果您#define
某事,您可以稍后使用局部变量或函数覆盖它。一个特别令人震惊的案例是Windows.h
#define
s min
和max
,如果您尝试使用std:::min
,除非您set NOMINMAX
,否则会出现编译错误。