1

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

4

3 回答 3

5
// 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; }
于 2013-08-14T11:45:27.767 回答
3

C/C++ 预处理只是操作/生成文本,不涉及语言规则。

于 2013-08-14T11:44:34.860 回答
3

一个经典的例子是

#define max 1234

...
class A
{
   int arr[100];
 public:
      ...
   int max() { ... find highest in arr ... }
};

这不会编译。

于 2013-08-14T11:47:19.043 回答