是否强制执行 #include 错误做法的 order/placement?
Is forcing the order/placement of a #include bad practice?
我有一些代码(下面的 "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];
//...
};
//...
这是不好的做法吗?如果可以,还有更好的选择吗?
恕我直言,如果可能的话,我建议不要这样做。我已经看到 libs 这样做了,并且因为试图找出问题所在而感到头疼。
MISRA 的一些规则鼓励您不要这样做。例如规则 3-1-1。
如果 wrapper1.h 和 wrapper2.h 在同一个程序中使用(即,如果您有一个 #include
s wrapper1.h 的源文件和另一个 #include
s wrapper2.h,那么你不能在同一个项目中使用这两个源文件而不小心避免出现问题——大多数做这种事情的人都没有那么小心)。这样做会违反一个定义规则(因为 struct foo
将在您的程序中有多个定义)。根据 C 标准,这会导致未定义的行为。
如果你在不同的项目中使用wrapper#.h,是没有问题的。然而,这是一个等待发生的错误——例如,是什么阻止你在未来某个时间在同一个项目中使用 wrapper1.h 和 wrapper2.h?没什么,就是这样。结果将是您的程序中的问题(在最坏的情况下,间歇性运行时错误)可能非常难以追踪。
你要问的问题是为什么不同的包装纸需要不同的尺寸,真正的区别是什么。然后正确设计您的 headers(以及受这些 headers 影响的函数)。代码(在本例中为 header 文件)重复使用可能会导致更多问题而不是更糟,这就是其中之一。
我有一些代码(下面的 "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];
//...
};
//...
这是不好的做法吗?如果可以,还有更好的选择吗?
恕我直言,如果可能的话,我建议不要这样做。我已经看到 libs 这样做了,并且因为试图找出问题所在而感到头疼。
MISRA 的一些规则鼓励您不要这样做。例如规则 3-1-1。
如果 wrapper1.h 和 wrapper2.h 在同一个程序中使用(即,如果您有一个 #include
s wrapper1.h 的源文件和另一个 #include
s wrapper2.h,那么你不能在同一个项目中使用这两个源文件而不小心避免出现问题——大多数做这种事情的人都没有那么小心)。这样做会违反一个定义规则(因为 struct foo
将在您的程序中有多个定义)。根据 C 标准,这会导致未定义的行为。
如果你在不同的项目中使用wrapper#.h,是没有问题的。然而,这是一个等待发生的错误——例如,是什么阻止你在未来某个时间在同一个项目中使用 wrapper1.h 和 wrapper2.h?没什么,就是这样。结果将是您的程序中的问题(在最坏的情况下,间歇性运行时错误)可能非常难以追踪。
你要问的问题是为什么不同的包装纸需要不同的尺寸,真正的区别是什么。然后正确设计您的 headers(以及受这些 headers 影响的函数)。代码(在本例中为 header 文件)重复使用可能会导致更多问题而不是更糟,这就是其中之一。