在标准 C 中使用pair和make_pair

发布于 2024-12-06 20:06:52 字数 158 浏览 2 评论 0原文

有没有办法在 C 中使用 std::pair 和 std::make_pair ?似乎它们适用于 C++。

当我使用

#include "utility"

它时,它说找不到这样的文件,

谢谢您的任何建议

Is there any way to use std::pair and std::make_pair in C? seems that they are applicable in C++.

As I used

#include "utility"

it says it can not find such file

thansk for any suggestion

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

栀子花开つ 2024-12-13 20:06:52

它仅适用于 C++。 C 没有模板,因此您必须使用宏来在某种程度上模拟它们,例如:

#define PAIR_TYPE(type1, type2)\
    typedef struct {\
        type1 first;\
        type2 second;\
    }
#define MAKE_PAIR(val1, val2) {val1, val2}

PAIR_TYPE(int, float) mypair;
mypair p = MAKE_PAIR(1, 12.0);

但这确实不值得麻烦,结果代码比仅使用普通结构更冗长且不那么明显。

It's C++-only. C has no templates, so you will have to roll your own with macros to emulate them to some extent, for example:

#define PAIR_TYPE(type1, type2)\
    typedef struct {\
        type1 first;\
        type2 second;\
    }
#define MAKE_PAIR(val1, val2) {val1, val2}

PAIR_TYPE(int, float) mypair;
mypair p = MAKE_PAIR(1, 12.0);

But it's really not worth the trouble, result code is more verbose and less obvious than just using plain structs.

太傻旳人生 2024-12-13 20:06:52

不,您不能在 C 中使用 STL(因为 STL 仅适用于 C++ 和 Objective-C++)。您可以使用结构体和指针来模拟 std::pair (因为 C 不支持模板):

struct pair {
  void *first;
  void *second;
};

void FreePair(struct pair* pair) {
  free(pair->first);
  free(pair->second);
  free(pair);
}

struct pair* MakePair(void *f, void *s, size_t fsize, size_t ssize) {
  struct pair* p = malloc(sizeof(struct pair));
  if (p == NULL) return NULL;
  p->first = malloc(fsize);
  p->second = malloc(ssize);
  if (p->first == NULL || p->second == NULL) {
    FreePair(p);
    return NULL;
  }
  memcpy(p->first, f, fsize);
  memcpy(p->second, s, ssize);
  return p;
}

int main() {
  int a = 42;
  const char* str = "Hello";
  struct pair* p = MakePair(&a, &str, sizeof(a), sizeof(str));
  printf("%d, %s", *(int*)p->first, *(const char**)p->second); // output: "42, Hello"
  FreePair(p);                              //  ^^ yes, this pointer pointer is correct
  return 0;
}

No, you cannot use the STL in C (as the STL only works with C++ and Objective-C++). You can mimic std::pair with a struct and with pointers (as C doesn't support templates):

struct pair {
  void *first;
  void *second;
};

void FreePair(struct pair* pair) {
  free(pair->first);
  free(pair->second);
  free(pair);
}

struct pair* MakePair(void *f, void *s, size_t fsize, size_t ssize) {
  struct pair* p = malloc(sizeof(struct pair));
  if (p == NULL) return NULL;
  p->first = malloc(fsize);
  p->second = malloc(ssize);
  if (p->first == NULL || p->second == NULL) {
    FreePair(p);
    return NULL;
  }
  memcpy(p->first, f, fsize);
  memcpy(p->second, s, ssize);
  return p;
}

int main() {
  int a = 42;
  const char* str = "Hello";
  struct pair* p = MakePair(&a, &str, sizeof(a), sizeof(str));
  printf("%d, %s", *(int*)p->first, *(const char**)p->second); // output: "42, Hello"
  FreePair(p);                              //  ^^ yes, this pointer pointer is correct
  return 0;
}
软甜啾 2024-12-13 20:06:52

有没有办法在 C 中使用 std::pair 和 std::make_pair ?看来它们适用于 C++。

不。std::pair 是 C++ 中的模板类,C 中没有类。C

中也没有与 C 中的pair 类似的东西(即易于使用的预定义数据结构)。

Is there any way to use std::pair and std::make_pair in C? seems that they are applicable in C++.

No. std::pair is a template class in C++, and there are no classes in C.

There is nothing similar (ie. easily usable predefined data structure) to pairs in C either.

薯片软お妹 2024-12-13 20:06:52

不,这些是来自 C++ 标准库的类型。这解释了 std:: 命名空间语法(C 也不支持命名空间)。

No, those are types from the C++ standard library. Which explains the std:: namespace syntax (C doesn't support namespaces either).

活泼老夫 2024-12-13 20:06:52

“utility”不是标准的 C 头文件。

不,标准 C++ 库完全依赖于不属于 C 语言一部分的模板。

"utility" is not a standard C header.

And no, the standard C++ library depends entirely on templates which are not part of the C language.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文