【发布时间】:2021-02-14 14:54:48
【问题描述】:
我正在使用宏在 C 中模拟模板。我想实现这样的目标:
// Struct.h
#define define_struct(type) \
typedef struct MyStruct { \
type value; \
}
struct MyStruct;
typedef struct MyStruct MyStruct;
MyStruct *createMyStruct();
// Struct.c
#include "Struct.h"
#include <stdlib.h>
MyStruct *createMyStruct() {
MyStruct *str = malloc(sizeof(MyStruct));
return str;
}
然后使用它:
#include "Struct.h"
define_struct(int);
int main() {
MyStruct *str = createMyStruct();
}
但这不起作用,因为struct MyStruct; 是一个不完整的类型,而malloc(MyStruct) 对编译器没有意义。是否有可能做到这一点而不会出错?
附:我明白,为什么这不起作用,我绝对确定我永远不需要定义这个结构的 2 个实例,而且我不能使用 C++,只能使用普通 C。
【问题讨论】:
-
请不要为此使用宏。它使代码难以阅读和调试。我为那些将在几年后回到这段代码并试图理解它的人感到同情。只做长手。从长远来看,让生活更轻松。
-
您必须在范围内正确调用
defined_struct来编译Struct.c。此外,您将只能在任何给定程序中使用一种类型。如果您想要在程序中使用多个这些类型,则必须为不同类型创建具有不同名称的函数,而您还没有尝试这样做。这通常涉及在宏中使用##运算符进行令牌粘贴,并且您需要的宏不仅仅是您目前拥有的宏。它不会使您的代码可读;它不会使您的代码易于理解;这将使其难以维护。不要! -
简而言之,如果你想要 C++,就使用 C++。
-
c 中的宏仅由预处理器使用。例如,在struct.c中你没有在使用MyStruct之前使用defined_struct(xxx),所以编译器无法编译未定义的结构。
-
要了解为什么你得到了诊断,在编译“Struct.c”时让自己扮演编译器的角色:应该有多少字节在不知道
MyStruct有多大的情况下传递给malloc()?