использование pair и make_pair в стандартном C

#c #utility #std-pair

#c #утилита #std-pair

Вопрос:

Есть ли какой-либо способ использовать std::pair и std::make_pair в C? кажется, что они применимы в C .

Поскольку я использовал

 #include "utility"
  

он говорит, что не может найти такой файл

спасибо за любые предложения

Комментарии:

1. std::pair — это шаблонный класс в C . В C. нет ни шаблонов, ни классов.

Ответ №1:

Это только для 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);
  

Но это действительно не стоит того, код результата более подробный и менее очевидный, чем просто использование простых структур.

Комментарии:

1. В нем говорится:./m2s.h:542:9: ошибка: неизвестное имя типа ‘type1’ ./m2s.h:543:9: ошибка: неизвестное имя типа ‘type2’ ./m2s.h:544:5: ошибка: ожидаемый идентификатор или ‘(’ перед ‘}’ токен

2. @mahmood вы уверены , что компилируете с помощью компилятора C, а не компилятора C ?

3. @manhood, отредактировано: я забыл обратную косую черту в многострочных макросах.

4. @WTP make использует «gcc» для сборки.

5. Любопытно, что этот ответ неверен. По крайней мере, часть «Да» 😉 К сожалению, я не могу отредактировать это, не изменив больше вещей (6 символов thd).

Ответ №2:

Нет, вы не можете использовать STL в C (поскольку 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(amp;a, amp;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;
}
  

Комментарии:

1. Обратите внимание, что это может быть медленнее, чем std::pair из-за динамического выделения памяти.

Ответ №3:

Есть ли какой-либо способ использовать std::pair и std::make_pair в C? кажется, что они применимы в C .

Нет. std::pair является шаблонным классом в C , а в C. классов нет.

Ничего подобного (т.е.. легко используемая предопределенная структура данных) для пар в C либо.

Ответ №4:

Нет, это типы из стандартной библиотеки C . Что объясняет синтаксис std:: namespace (C также не поддерживает пространства имен).

Ответ №5:

«утилита» не является стандартным заголовком C.

И нет, стандартная библиотека C полностью зависит от шаблонов, которые не являются частью языка C.

Комментарии:

1. «утилита» — это стандартный заголовок в C . Разница между "" и <> зависит от реализации.