为什么CERT标准PRE00-CPP说"Avoid defining macros"

Why CERT standard PRE00-CPP says "Avoid defining macros"

本文关键字:Avoid macros defining CERT 标准 PRE00-CPP 为什么      更新时间:2023-10-16

根据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::valueY::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 ... }
};

这不会编译。