可视化 C++ 宏重定义的范围是什么
visual What is the scope of a c++ macro redefinition?
>我有一个 c++ 实现文件 (my.cpp),它间接包含一个头文件 (b.h),它定义了_MAX_DRIVE:
// b.h
#define _MAX_DRIVE 64
然后my.cpp包括stdlib.h,它也定义了_MAX_DRIVE
// stdlib.h
#define _MAX_DRIVE 3 /* max. length of drive component */
显然,这会产生宏重定义警告:
stdlib.h(185) : warning C4005: '_MAX_DRIVE' : macro redefinition
我的问题是:
- 这种重新定义影响了多少代码,它只是 my.cpp 的编译单元吗?
- 如果 my.cpp 是静态库的一部分,重新定义的值是否可以进入其他代码?
- 如果我什至从未在 my.cpp 中引用_MAX_DRIVE,那么告诉编译器忽略此宏重定义警告是否安全?
- 直到当前编译单元结束,或者直到下一个
#undef
。 - 否;宏名称仅由预处理器看到,预处理器甚至在编译开始之前就完成了运行。
- 这听起来不是一个非常明智的想法。 最好避免使用两个具有相同名称的宏(尤其是一个以单个下划线开头,后跟大写字母的宏,因为它们是为实现保留的)。
这种重新定义影响了多少代码,它只是 my.cpp 的编译单元吗?
它会影响包括 b.h 和 stdlib.h 的所有文件,如果它从未被#undef
-ed
如果 my.cpp 是静态库的一部分,重新定义的值是否可以进入其他代码?
不,预处理器符号仅在编译时存在。编译的模块与它无关。
如果我什至从未在 my.cpp 中引用_MAX_DRIVE,那么告诉编译器忽略此宏重定义警告是否安全?
是的,直到有一天你或任何代码用户使用它并忘记或不知道这种危险。
相关文章:
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- set_intersection范围范围
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 这个变量在 C++ 中的范围是什么?
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 满足标准::范围::范围概念
- 向量向量的范围范围
- 为什么这个循环变量在循环范围之外是可访问的
- 运算符重载中变量的数据类型和范围应该是什么
- 统一实际分布的范围限制是多少
- 用辅助方法范围范围的问题来操纵字符串
- 用于循环范围范围
- 在C++中实现随机预言机(输出在范围内是随机的,但对于相同的输入输出是相同的)
- 在C++11中,用什么方法对数组进行简单的范围管理是最干净的
- 矢量超出范围/范围检查
- 以一种漂亮的STL方式检查一个范围是否是另一个范围的子范围