有没有办法在C中使用std :: pair和std :: make_pair?似乎它们适用于C ++。
我用过
#include "utility"
它说它找不到这样的文件
thansk任何建议
答案 0 :(得分:6)
它只是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 :(得分:1)
不,你不能在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;
}
答案 2 :(得分:0)
有没有办法在C中使用std :: pair和std :: make_pair?似乎它们适用于C ++。
没有。 std::pair
是C ++中的模板类,C中没有类。
在C中,没有类似的东西(即容易使用的预定义数据结构)。
答案 3 :(得分:0)
不,这些是来自C ++标准库的类型。这解释了std :: namespace语法(C也不支持名称空间)。
答案 4 :(得分:0)
“实用程序”不是标准C头。
不,标准C ++库完全依赖于不属于C语言的模板。