#undef 在我的 C 程序中没有按预期工作

#undef not work as expected in my C program

我正在编写线性列表 ADT 作为我在 DS 中的练习 class。我使用一个头文件,一个函数源代码和一个驱动程序作为一个整体项目。我在头文件中定义了宏"ELEMENT_TYPE"和"MAXSIZE"。我的设计是我可以在驱动程序中#undef 并立即#define 这两个宏来将"ELEMENT_TYPE" 更改为驱动程序需要的任何类型。 如果我输入这些代码:

#undef ELEMENT_TYPE
#define ELEMENT_TYPE char
#undef MAXSIZE
#define MAXSIZE 50

在#define之后进入头文件,然后在驱动程序中,函数可以正确识别(例如,insertion()的第二个扩充是"ELEMENT_TYPE",使用上面的代码,IDE 表明 insertion() 在驱动程序中收到一个 char 扩充。)但是,如果我将这些代码放入 #include "foo.h" 下面的驱动程序中,那么 IDE 无法识别函数应该增加什么接收并使用 "ELEMENT_TYPE" 的初始定义,在本例中为 int。谁知道我的程序出了什么问题,导致预处理指令无法正常工作?

原始代码如下: driver.c https://paste.ubuntu.com/p/6B76vmk6nN/

linear_list.c https://paste.ubuntu.com/p/SHq4W5zkGM/

linear_list.h https://paste.ubuntu.com/p/VY8vcgFD89/

PS:我的母语不是英语,所以可能有些地方没表达清楚。指出它们,如果需要我会添加更多详细信息。

源代码中的宏将替换为在源代码中使用宏时有效的宏定义。因此使用 ELEMENT_TYPE 的函数声明使用最近在声明之前的宏定义。稍后更改宏不会更改函数定义。

另一种方法是在 header 中定义 ELEMENT_TYPE,前提是它尚未定义:

#if ! defined ELEMENT_TYPE
    #define ELEMENT_TYPE char
#endif

然后源文件可以执行以下任一操作:

  • 不要定义 ELEMENT_TYPE 本身。当包含 header 时,将使用默认类型 char

  • 定义 ELEMENT_TYPE,然后包含 header。如果需要,#undef ELEMENT_TYPE 之后。将使用源文件在 ELEMENT_TYPE 中提供的类型。

driver和使用它的程序必须使用相同的类型。您不能使用一种类型编译 driver 而使用另一种类型编译程序。用不同的类型编译程序不会改变 driver.

这听起来像是您正在尝试 #define driver 中的这些值,希望它们将在 linear_list.c 中保持定义。

问题是这些文件是单独编译然后链接的。 driver.c 中的 #define 无法更改 linear_list.c 中的 #define

为了达到您想要的效果,您需要更改 linear_list.h 中的这些值。这是执行此操作的最佳方法,因为 header 包含在两个源文件中,并且可能在任何使用 linear_list.c 中定义的函数的文件中都是 #included。请记住,为了查看程序行为的变化,您不仅需要重新编译 driver.c,还需要在对 linear_list.h 进行更改后重新编译 linear_list.c。

作为旁注,您通常应该 #include 本地 header 像 linear_list.h 之后 #include 全局 header 像 stdio.h 和 stdlib.h。在 linear_list.c 中,如果使用了这些标识符,那么任何一个 header 都可以覆盖您在 linear_list.h 中使用的值。它们看起来很常见,一些 header 可能会使用它们并非不可信,因此将来使用更独特的标识符可能是值得的。这引出了我的最后一点:在这些标识符上使用 #undef 而不检查它们是否在其他地方使用可能会导致一些问题,因此您通常应该检查 #ifndef.

希望对您有所帮助。如果理解有误请指正

编辑: 澄清,补充信息,感谢 other answer 提醒我一些重要的做法。