#define在c++中主要用于什么?

What is #define mostly used for in c++?

本文关键字:用于 什么 c++ #define      更新时间:2023-10-16

我刚才一直在使用#define来改变我的值,例如:

    #include <iostream>
    #include <string>
    #define Changed_num 100
    using namespace std;
    int main ()
    {
        cout<< Changed_num<< endl;
    }

但是我听说有一种更好的方法可以做到这一点,而不需要#define(其他方法是什么?)

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

在本例中,与#define等价的c++是const。内部#define不是由编译器使用,而是由预编译器,在实际发送给编译器之前修改代码。因此,在您的情况下,编译器实际上只能看到cout<<100<<endl;。使用const是更好的实践,因为它实际上是类型安全的。

#define在c++中最常见的用例是包含保护,以确保头文件只被任何特定对象包含一次。

亚军最有可能用于特定于平台的编译/优化,参见此链接获取一些示例。

一般来说:是的,你应该尽量避免使用#define(参见c++常见问题:你是说预处理器是邪恶的吗?)

原因是#define s是由预处理器处理的,这是在词法层面(全局),所以你对#define 替换的效果的控制不是那么好,很可能适得其反(例如,替换是因为你包含了一个头,其中包含了一个头,其中包含了一个头与#define,导致你的代码行为不当或根本无法编译)。

你应该用什么?

  • 对于常量,好吧,常量(例如const int Changed_num=100)变量或静态类属性。(参见:为什么我要使用const变量/const标识符而不是#define?)。请查看c++ 11中的constexpr new关键字。
  • 代码。你应该试着写代码(你知道)类,抽象…等,而不是剪切和粘贴:D(这或多或少就是#define)。在使用宏参数的某些情况下,您可以尝试用模板代码....替换它在其他一些情况下,您仍然需要使用宏
  • 对于条件编译(由@James Kanze建议):您可以使用不同版本的头文件,放置在不同的包含目录中(并在编译时使用不同的-I选项进行选择)。

当你仍然应该使用#define

  • 包括警卫
  • 在某些情况下,代码(但要非常清楚它的缺点)。
  • 条件编译,例如多平台构建(再次,要非常清楚缺点)[但考虑使用上面描述的不同包含目录的选项]

对于常量值,使用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中已被基于范围的for所取代)或boost::python。但是,一般来说,您最好使用[模板化]函数,以便获得适当的类型安全。

#define的主要缺点是它是一个超级重的锤子。如果你#define的东西,你不能覆盖它与局部变量或函数以后。一个特别令人震惊的例子是Windows.h, #define, minmax,如果你试图使用std:::min,除非你设置NOMINMAX,否则会导致编译器错误。