#define在c++中主要用于什么?
What is #define mostly used for in c++?
我刚才一直在使用#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
, min
和max
,如果你试图使用std:::min
,除非你设置NOMINMAX
,否则会导致编译器错误。
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 什么最适合用于优化SFML项目?
- 我正在尝试学习如何在 c++ 中传递指针,但出现错误:没有用于调用"test"的匹配函数。我做错了什么?
- 矢量类型规范中的星号用于什么?
- 谁能告诉我,程序中的错误是什么?该程序仅用于获取文件扩展名
- cv2有什么区别.StereoSGBM_create() 和 cv2.StereoBM_create() 函数用于 Op
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 当正斜杠运算符应用于C++中的字符串类型时,它会做什么
- abi-compliance-checker 中的扩展选项用于什么?
- 什么是应用于C 和CMAKE的定义
- 在TensorFlow C++中用于feed_dict的语法是什么?
- 什么是最快的解决方案,用于读/写入哈希映射
- 除了集合之外,模板还可以用于什么
- 详细信息命名空间通常用于什么
- 我的$Foo ATL解决方案中的($Foo)PS项目用于什么
- 第二个用于什么
- #define在c++中主要用于什么?
- 视觉 除了垃圾回收之外,"new_handler"还可以用于C++什么?