c - 是否强制#include 不良做法的顺序/放置?

标签 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];
   //...
};
//...

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

最佳答案

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

如果在不同的项目中使用wrapper#.h,是没有问题的。然而,这是一个等待发生的错误——例如,是什么阻止你在未来某个时间在同一个项目中使用 wrapper1.h 和 wrapper2.h?没什么,就是这样。结果将是您的程序中的问题(在最坏的情况下,间歇性运行时错误)可能非常难以追踪。

您需要问的问题是为什么您需要在不同的 wrapper 中使用不同的尺寸,以及真正的区别是什么。然后正确设计您的 header (以及受这些 header 影响的功能)。代码(在本例中为头文件)重用有时会导致更多问题,而不是更糟,这就是其中之一。

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

相关文章:

objective-c - 如何在 Xcode 中定义预处理器符号

C - 为什么当我编译时它无法识别源文件(.c)?

将此 C 代码转换为 Delphi 代码

c - 如何用 char 初始化矩阵。我正在尝试做公鸡游戏,一开始我需要一个 3x3 的矩阵,其中 "-"

c - 在c中对字符串数组进行排序,但程序崩溃

c - 我应该使用 #include <file.h> 还是 "file.h"?

php - Unix 权限,读取与执行(PHP 上下文)

c++ - 调试 C++ 预处理器

c++ - 从宏生成和保存代码

c - 通过输入获取值并在运行时显示它们