如何使用MSVC内在函数来获得相当于这个GCC代码?

以下代码在GCC中调用clz / ctz的内置函数,在其他系统上调用C版本。 显然,如果系统有内置的clz / ctz指令,如x86和ARM,则C版本有点不理想。 #ifdef __GNUC__ #define clz(x) __builtin_clz(x) #define ctz(x) __builtin_ctz(x) #else static uint32_t ALWAYS_INLINE popcnt( uint32_t x ) { x -= ((x >> 1) & 0x55555555); x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); x = (((x >> 4) + x) & 0x0f0f0f0f); x += (x >> 8); […]

有没有办法偷看stdin缓冲区?

我们知道stdin默认是一个缓冲输入; 证据就是使用了在stdin上“保留数据”的任何机制,例如scanf() : int main() { char c[10] = {‘\0’}; scanf(“%9s”, c); printf(“%s, and left is: %d\n”, c, getchar()); return 0; } ./a.out 你好 你好,左边是10 10当然是新行…… 我一直很好奇,有没有办法“偷看” stdin缓冲区而不删除那里可能存在的东西? 编辑 一个更好的例子可能是: scanf(“%9[^.]”, c); 输入“at.ct”,现在我在stdin留下了“数据”( ct\n ),而不仅仅是换行符。

C将void指针转换为函数指针

我正在尝试创建一些我可以用来创建自己的unit testing库的宏。 我的头文件如下所示: #ifndef _TEST_H_ #define _TEST_H_ #include #include “hehe_stack.h” static hehe_stack* tests; typedef int (*testfunc)(); #define test_init() tests = hehe_stack_init(); #define test_register(test) hehe_stack_push(tests, test); #define test_info() fprintf(stdout, “running %s :: %s \n”, __FILE__, __func__); #define test_run() testfunc = (int (*)()) hehe_stack_pop(tests); testfunc(); return 0; #endif 在每个测试.c文件中,我想将一些函数指针推入测试堆栈,然后将每个函数指针弹出堆栈并调用它。 我的堆栈pop方法返回一个void指针,我推送到它的函数指针返回一个int并且不带参数。 我的语法不正确吗? 我觉得我应该能够做到这一点。

我们为什么要转换malloc的返回值?

有人可以向我解释为什么有些程序员在malloc前使用(char *)? 我知道它返回void但为什么我要它只返回char内存? 对不起,我只是编程新手。 谢谢

扫描后的SegFault?

#include #define TimeConverter 60 #define TempFormula time * time * 4 / time + 2 – 20 double HoursMinToTime(int hour, int min); double Temperature(double time); int main() { int hour, min; double time, temperature; printf(“Hours and minutes: “); scanf(“%d %d”, hour, min); //Segfault HERE time = HoursMinToTime(hour, min); temperature = Temperature(time); printf(“After a %lf hour […]

为什么scanf必须采用运算符的地址

正如标题所说,我总是想知道为什么scanf必须采用运算符(&)的address of 。

用于计数位的高效按位运算或找到最右侧的位

给定unsigned int,我必须执行以下操作: 计算设置为1的位数 找到最左边1位的索引 找到最右边1位的索引 (该操作不应该是架构依赖)。 我已经使用按位移位完成了这项工作,但我必须迭代几乎所有的位(es.32)。 例如,计算1: unsigned int number= …; while(number != 0){ if ((number & 0x01) != 0) ++count; number >>=1; } 其他操作类似。 所以我的问题是:有没有更快的方法呢?

除了powershell搜索之外,如何在凸包中找到最大的三角形

给定凸多边形,如何找到定义具有最大面积的三角形的3个点。 相关:该三角形的外接圆是否也会定义多边形的最小边界圆?

fgets()是否返回NULL并且符合短缓冲区?

在unit testing中,包含fgets()的函数在缓冲区大小n < 2时遇到意外结果。 显然这样的缓冲区大小是愚蠢的,但测试正在探索极端情况。 简化代码: #include #include void test_fgets(char * restrict s, int n) { FILE *stream = stdin; s[0] = 42; printf(” errno:%d feof:%d ferror:%d retval:%ps[0]:%d\n\n”, errno, feof(stream), ferror(stream), retval, s[0]); } int main(void) { char s[100]; test_fgets(s, sizeof s); // Entered “123\n” and works as expected test_fgets(s, 1); // fgets() –> NULL, […]

是否需要C enum中的最后一个逗号?

C enum声明中是否需要最后一个逗号? ie是VAL3要求后的逗号? enum { Val1, Val2, Val3, } someEnum; 将其留入/取出是否有任何副作用 谢谢