我有一些代码(“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];
   //...
};
//...

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

最佳答案

如果wrapper1.h和wrapper2.h在同一个程序中使用(即,如果您有一个#includes wrapper1.h的源文件和另一个#includes wrapper2.h的源文件,那么您不能在同一个项目中使用这两个源文件,除非非常小心地避免出现问题,而且大多数做这种事情的人都没有那么小心)。这样做将违反一个定义规则(因为struct foo将在您的程序中有多个定义)。根据C标准,这会导致未定义的行为。
如果在不同的项目中使用包装器#.h,就没有问题。然而,这是一个等待发生的错误——例如,在将来的某个时候,什么可以阻止您在同一个项目中使用wrapper1.h和wrapper2.h?没什么,就是这样。结果将是程序中的问题(最坏的情况是,间歇性运行时错误),这些问题很难追踪。
你需要问的问题是为什么你需要在不同的包装中有不同的尺寸,真正的区别是什么。然后正确地设计头(以及受这些头影响的函数)。在某种程度上,代码(在本例中是头文件)重用会导致更多的问题,而不是更糟的问题,这就是其中之一。

关于c - 是否在强制#include不良做法的顺序/位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32533434/

10-11 04:23