我有一些代码(下面的“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 在同一个程序中使用(即,如果您有一个源文件 #include
wrapper1.h 和另一个 #include
s wrapper2.h,那么你不能在同一个项目中使用这两个源文件而不小心避免出现问题——大多数做这种事情的人都没有那么小心)。这样做会违反一个定义规则(因为 struct foo
在您的程序中会有多个定义)。根据 C 标准,这会导致未定义的行为。
如果在不同的项目中使用wrapper#.h,是没有问题的。然而,这是一个等待发生的错误——例如,是什么阻止你在未来某个时间在同一个项目中使用 wrapper1.h 和 wrapper2.h?没什么,就是这样。结果将是您的程序中的问题(在最坏的情况下,间歇性运行时错误)可能非常难以追踪。
您需要问的问题是为什么您需要在不同的 wrapper 中使用不同的尺寸,以及真正的区别是什么。然后正确设计您的 header (以及受这些 header 影响的功能)。代码(在本例中为头文件)重用有时会导致更多问题,而不是更糟,这就是其中之一。
关于c - 是否强制#include 不良做法的顺序/放置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32533434/