【问题标题】:Different prototyping with typedef and #define使用 typedef 和 #define 进行不同的原型设计
【发布时间】:2012-04-14 21:18:38
【问题描述】:

我正在为一个项目编写一组链表函数。
我需要为列表节点(int/char)中的数据类型提供灵活性

所以我正在尝试做这样的事情:

在 main.cpp 中

#define INT_DATA
#include "lists.h"
....

在lists.h中

#ifdef CHAR_DATA
typedef char DATA_TYPE;
#endif
#ifdef INT_DATA
typedef int DATA_TYPE;
#endif

typedef struct lnode {
    DATA_TYPE data;
    struct lnode* next; //points to the next node
} LNODE;

LNODE * createNewListNode(DATA_TYPE data, LNODE* next);
....

但所有这些似乎都不起作用...... 当只是原型不同时,我不想编写重复的代码..

我做错了什么?这可能吗?

请注意

这是一个练习,我不能使用类,我不能使用任何标准库

【问题讨论】:

  • 如果您使用的是 C++,那么也许您可以简单地使用 std::list 而不是自己编写?
  • 为什么要使用像预处理器这样笨重的东西而不是模板?另外,您能否将遇到的错误添加到您的问题中?
  • 那不是 C++,那是 C。你不会用 .cpp 扩展名欺骗任何人。如果你想真正做 C++,请使用模板。
  • @BenC 我不能使用类,我不能使用任何标准库
  • @EtiennedeMartel 我不能使用类,我不能使用任何标准库

标签: c++ c linked-list typedef c-preprocessor


【解决方案1】:

这是 C++ 的模板进入的地方。模板允许您创建实现的框架。在这种情况下,您可能需要一个将“数据类型”作为参数的类。听起来不错……这就是它的样子:

template < typename DATA_TYPE >  
struct lnode {
  DATA_TYPE data;
  lnode<DATA_TYPE>* next; //points to the next node
};

然后你可以像这样创建它们:

lnode<char> charNode;
lnode<int> intNode;

【讨论】:

  • 当我有几十个函数需要模板化时,我该如何应用它?有没有比在每个原型之前复制“template ”更好的方法?
  • 没有。如果您查看我的答案,您会发现两个指向有关模板的文章的链接。但是,有一种方法:将函数作为某个类的静态成员 - 然后您可以只模板化该类,而不是每个函数都单独使用。我希望 C++ 允许模板命名空间...
  • @OmerCohen 在这种情况下,您可能更喜欢在类主体中使用方法和声明函数——如果这对他们来说是一个合适的地方。
  • @justin 我不能使用类,我不能使用任何标准库
【解决方案2】:

不要使用定义。使用模板(好文章:onetwo)。

另外,typedef struct lnode { /* ... */ } LNODE; 只是 C,甚至不接近 C++。

【讨论】:

  • C++ 是 c 的超集。那么为什么表现得像 c 代码不是有效的 c++ 代码呢?这甚至没有解决这个问题。这是一个小论点,没有提供任何建设性的东西。另一方面,链接可能是他应该开始的地方。
  • @Dan,很长一段时间以来,C++ 都不是 C 的超集。
猜你喜欢
  • 2017-04-23
  • 2012-11-16
  • 2014-12-03
  • 2010-12-12
  • 2011-03-06
  • 1970-01-01
  • 2013-04-14
相关资源
最近更新 更多