根据CERT standards 类似对象的宏可能很危险,因为它们的使用不受语言范围规则的约束 。任何人都可以用一个例子解释它是如何成问题的。例如,我有一个类似于对象的宏#define BUFFER_SIZE 1024
答案 0 :(得分:5)
// file a.hpp
#define SOME_MACRO 42
// file some/nested/dir/really/far/in/x.hpp
#define SOME_MACRO 13
KABOOM。使用任何类型的范围都可以轻松避免这种情况,例如
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; }
答案 1 :(得分:3)
C / C ++预处理只是操纵/生成文本,不涉及语言规则。
答案 2 :(得分:3)
一个典型的例子是
#define max 1234
...
class A
{
int arr[100];
public:
...
int max() { ... find highest in arr ... }
};
这不会编译。