为什么CERT标准PRE00-CPP说“避免定义宏”

时间:2013-08-14 11:39:49

标签: c++ c macros

根据CERT standards 类似对象的宏可能很危险,因为它们的使用不受语言范围规则的约束 。任何人都可以用一个例子解释它是如何成问题的。例如,我有一个类似于对象的宏#define BUFFER_SIZE 1024

3 个答案:

答案 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::valueY::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 ... }
};

这不会编译。