什么是#define主要用于c ++?

时间:2014-06-17 05:14:29

标签: c++

我刚刚使用#define来更改我的值ex:

    #include <iostream>
    #include <string>

    #define Changed_num 100

    using namespace std;

    int main ()

    {
        cout<< Changed_num<< endl;
    }

但是我听说没有#define有更好的方法可以做到这一点(另一种方式是什么?)

所以我请问,为什么你需要#define呢?什么是最常见的用途?

3 个答案:

答案 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关键字。
  • 代码。您应该尝试编写代码(您知道)类,抽象...等而不是剪切和粘贴:D(这或多或少是#define)。在某些使用宏参数的情况下,您可以尝试用模板化代码替换它....在其他一些情况下,您仍然需要使用宏
  • 对于条件编译(由@James Kanze建议):您可以使用不同版本的头文件,放置在不同的包含目录中(并在编译时使用不同的-I选项进行选择)。

何时仍应使用#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 minmax,如果您尝试使用std:::min,除非您set NOMINMAX,否则会出现编译错误。