为什么CERT标准PRE00-CPP说"Avoid defining macros"
Why CERT standard PRE00-CPP says "Avoid defining macros"
根据CERT标准类对象宏可能很危险,因为它们的使用不受语言范围规则的约束。谁能举个例子解释一下它是怎么出问题的吗。例如,我有一个类似对象的宏#define BUFFER_SIZE 1024
// file a.hpp
#define SOME_MACRO 42
// file some/nested/dir/really/far/in/x.hpp
#define SOME_MACRO 13
卡博姆。使用任何类型的范围都可以很容易地避免这种情况,例如
struct X { static unsigned const value = 42; };
struct Y { static unsigned const value = 13; };
现在您可以访问X::value
和Y::value
。命名空间也是如此:
namespace a { struct X; }
namespace b { struct X; }
C/C++预处理只是操作/生成文本,不涉及语言规则。
就是一个经典的例子
#define max 1234
...
class A
{
int arr[100];
public:
...
int max() { ... find highest in arr ... }
};
这不会编译。
相关文章:
- C++ Macros #ifdef
- C++ vcproj OutputDirectory macros
- C++ Overloading Macros
- Constexpr vs macros
- typedef 和 Macros 有什么区别
- 为什么CERT标准PRE00-CPP说"Avoid defining macros"
- 在printf中使用MACROS,该MACROS可以扩展为整数或无值
- 对于可变长度的函数指针,在C++中使用内联函数或MACROS更好
- C/C++ macros instead of const
- Stringize __VA_ARGS__ (C++ variadic macros)
- spsc_queue pop - avoid memcpy?
- Variadic macros