Tag: generics

C中只有一次伪通用标头

在对通用向量进行了一些工作后,我询问了这个问题 ,我想知道是否有任何方法可以检查每个类型的库的每个实例只进行一次。 这是当前头文件的样子: #ifndef VECTOR_GENERIC_MACROS #define VECTOR_GENERIC_MACROS #ifndef TOKENPASTE #define TOKENPASTE(a, b) a ## b #endif #define vector_t(T) TOKENPASTE(vector_t_, T) #define vector_at(T) TOKENPASTE(*vector_at_, T) #define vector_init(T) TOKENPASTE(vector_init_, T) #define vector_destroy(T) TOKENPASTE(vector_destroy_, T) #define vector_new(T) TOKENPASTE(vector_new_, T) #define vector_delete(T) TOKENPASTE(vector_delete_, T) #define vector_push_back(T) TOKENPASTE(vector_push_back_, T) #define vector_pop_back(T) TOKENPASTE(vector_pop_back_, T) #define vector_resize(T) TOKENPASTE(vector_resize_, T) #define vector_reserve(T) TOKENPASTE(vector_reserve_, […]

gcc优化复合语句

我在c中为通用可resize的向量实现push_back运算符时遇到问题。 对于通用性,我需要使用void指针作为参数,但实际上我想直接给它赋值。 当我使用gcc -ot test.c -std=c99编译下面的代码时,它会按照我的预期打印10 。 当我向编译选项添加-O1 (或更高版本)时,程序将打印0 。 我认为问题在于smemcpy代码,因为当我用memcpy替换它时我不再有这个问题。 简化代码: #include #include #define get_pointer(value) ({ __typeof__(value) tmp = value; &tmp; }) // copy from src to dst byte by byte void* smemcpy(void* dst, void const * src, size_t len) { char * pdst = (char *) dst; char const * psrc = (char […]

如何初始化c中的generics函数

我在c中尝试使用generics比较函数的一个简单示例,但在初始化时,我得到的警告信息是类型在初始化时不兼容。 感觉我在这里缺少一些基本的东西…… #include #include int compare(int (*comp)(void *first, void *second), void *arr, int size) { int i, j, dups=0, arrsize=sizeof(arr)/size; for(i=0; i<arrsize; i++) { for(j=0; j<arrsize; j++) { if(j!=i) dups+=(*comp)(&arr[i], &arr[j]); } } return dups; } int compareints(int *first, int *second) { if(*first==*second) return 1; return 0; } int main(int argc, const char * argv[]) […]

兼容类型并忽略C类型系统中的顶级限定符

这是一个多部分的问题。 我一直在努力了解C型系统。 首先,C标准提到了“兼容类型”一词,所以我试图理解这一点。 这个定义似乎很分散,但我发现: 6.2.7兼容类型和复合类型1如果类型相同,则两种类型具有兼容类型。 确定两种类型是否兼容的附加规则在6.7.2中描述了类型说明符,在6.7.3中描述了类型限定符,在6.7.6中描述了声明符.55)此外,两个结构,联合或枚举类型在单独声明如果翻译单元的标签和成员满足以下要求,则它们是兼容的:如果使用标签声明一个,则另一个应使用相同的标签声明。 如果两者都在各自的翻译单元内的任何地方完成,那么以下附加要求适用:其成员之间应存在一对一的对应关系,以便每对相应的成员被宣布为兼容类型; 如果使用对齐说明符声明该对中的一个成员,则使用等效的对齐说明符声明另一个成员; 如果该对的一个成员使用名称声明,则另一个成员使用相同的名称声明。 对于两个结构,相应的成员应按相同的顺序声明。 对于两个结构或联合,相应的位域应具有相同的宽度。 对于两个枚举,相应的成员应具有相同的值。 REFS: 6.7.2 short == short int == signed short == signed short int, etc. 6.7.3 10) For two qualified types to be compatible, both shall have the identically qualified version of a compatible type; the order of type qualifiers within a list of […]

C中fprintf的通用参数

我正在编写一个函数,使用fprintf函数将数据保存到C中的文件中。 但是,这需要占位符作为其参数之一。 例如:%s表示字符串,%d表示整数…如果数据类型是通用的,我该怎么办,也就是说,使用此函数的程序员可以将我写入文件的变量的数据类型设置为任何内容他要? 谢谢!

c11 _Generic添加类型

如何为c11 _Generic Functions添加额外的类型? 你需要#undef / re- #define吗?(如果有以下工作的话)或者有更好的方法吗? #define to_str(X) _Generic((X), \ long double: ld_str, \ double: d_str, \ float: f_str, \ )(X) #undef to_str #define to_str(X) _Generic((X), \ long double: ld_str, \ double: d_str, \ float: f_str, \ int: i_str, \ )(X)

如何使宏返回字符而不是字符串?

我有以下宏(跟进: 在C中编写宏时,如何找到参数的类型和printf说明符? ): #define mu_format_specifier(expression) _Generic((expression), unsigned long: “%lu”, int: “%i”) #define mu_assert_equal(actual, expected) do { \ if (actual != expected) { \ char *message = malloc(MAX_ERROR_MESSAGE_LENGTH); \ if (message == NULL) { printf(“malloc failed”); exit(1); } \ snprintf(message, MAX_ERROR_MESSAGE_LENGTH, \ “required: %s != %s, reality: %s == ” mu_format_specifier(actual), \ #actual, #expected, #actual, actual); […]

使用宏进行类型generics编程:确定类型的技巧?

可以将某些类型的类型generics函数作为C中的宏来执行,例如: #define SQRT(x) (sizeof(x) == sizeof(float) ? sqrtf((x)) : \ sizeof(x) == sizeof(double) ? sqrt((x)) : \ sqrtl((x)) ) 只要x是浮点类型,这(大多数情况下)就可以正常工作。 但是,如果我想要一个可以采用整数类型或指针类型的类型通用宏,它可能具有相同的大小。 有没有一种聪明的方法来测试宏参数是整数还是指针? 整数与浮点类型怎么样?

C通用链表

我有一个通用链接列表,其中包含void *类型的数据我试图用类型struct employee填充我的列表,最终我想破坏对象struct employee。 考虑这个通用的链表头文件(我用char *类型测试过它): struct accListNode //the nodes of a linked-list for any data type { void *data; //generic pointer to any data type struct accListNode *next; //the next node in the list }; struct accList //a linked-list consisting of accListNodes { struct accListNode *head; struct accListNode *tail; int size; }; void accList_allocate(struct […]

C中的通用堆栈

我在C中实现generics堆栈,我在stackPop方法中遇到问题。 我的结构如下: “Stack.h”文件 typedef struct{ void *elems; int elemSize; int allocLength; int logLength; void (*freefnc)(void *); } Stack; void stackNew(Stack *s, int elemSize, void (*freefnc)(void *)); void stackDispose(Stack *s); void stackPush(Stack *s, void *elemAddr); void stackPop(Stack *s, void *target); Stack.c #inlcude void stackNew(Stack *s, int elemSize, void (*freefnc)(void *)){ s.allocLength = 4; s.logLength = 0; […]