是强制#include错误做法的顺序/位置?

时间:2015-09-11 23:18:32

标签: c include c-preprocessor

我有一些代码(" core.h"下面),它与几个不同的包装器一起使用。每个包装器都要求它具有不同大小的阵列。目前我在包装器头文件中使用#define来指定该数组的大小,但是在包含头之前必须在文件中写入#define

/*wrapper1.h*/
#define ARR_SIZE 42 // this must be written before-
#include "core.h"   // this to ensure correct operation
//...

/*wrapper2.h*/
#define ARR_SIZE 128
#include "core.h"
//...

/*core.h*/
#ifndef ARR_SIZE
#define ARR_SIZE 256 // default value
#endif
struct foo
{
   char arr[ARR_SIZE];
   //...
};
//...

这是不好的做法吗?如果是这样,有没有更好的选择?

2 个答案:

答案 0 :(得分:1)

恕我直言,如果可能的话,我鼓励不要这样做。我已经看到libs以这种方式做到这一点并且通过试图找出错误而感到头痛。

MISRA的一些规则鼓励你不要这样做。例如规则3-1-1。

答案 1 :(得分:1)

如果在同一个程序中使用了wrapper1.h和wrapper2.h(即如果你有一个#include的wrapper1.h源文件和另一个#include的wrapper2.h,那么你不能在同一个项目中使用这两个源文件而不必小心避免问题 - 大多数人做这类事情并不那么谨慎。这样做会违反一个定义规则(因为struct foo将在您的程序中有多个定义)。根据C标准,这会导致未定义的行为。

如果在不同的项目中使用包装器#.h,则没有问题。但是,这是一个等待发生的错误 - 例如,什么是阻止你在将来某个项目中使用wrapper1.h和wrapper2.h?没什么,那是什么。结果将是程序中的问题(在最坏的情况下,间歇性的运行时错误),这些问题很难被追踪。

您需要问的问题是,为什么您需要在不同的包装中使用不同的尺寸,以及真正的差异是什么。然后正确设计标题(以及受这些标题影响的函数)。有一点,代码(在这种情况下是头文件)重用会导致更多问题,而不是更糟糕,这就是其中之一。