Tag: 函数

为什么GCC保持空function?

在大多数情况下,如果我想在C中创建一个可选function,我只需创建两个这样的函数: #ifdef OPTIONAL_SOMETHING void do_something(int n, const char *s) { while (n–) { printf(“%s”, s); } /* …You might get the point, really do something… */ } #else void do_something(int n, const char *s) { /* Empty body */ } #endif 因此,如果符号未定义 – 禁用该function时 – 将空函数编译到可执行文件中。 深入研究汇编列表,似乎GCC 在禁用优化时编译并调用空函数。 如果启用了优化 ,也使用了-O2和-O3 ,它只编译必要的堆栈处理代码,但它会优化调用指令。 总而言之,它保留了function。 大约相同的情况适用于非空但未使用的方法。 它应该简单地扔掉整个东西,但事实并非如此。 为什么它是默认行为? […]

C中的函数指针数组

我很难理解函数指针的语法。 我要做的是,有一个函数指针数组,不带参数,并返回一个void指针。 任何人都可以帮忙吗?

在C中声明一个void函数?

我正在学习C,我正在学习函数。 所以,我读到当我实现自己的函数时,我必须在main()之前声明它。 如果我错过了声明,编译器将收到错误消息。 当我研究这个例子时(发现该数字是素数) #include void prime(); //function prototype(declaration) int main() { int num,i,flag; num = input(); // No argument is passed to input() for(i=2,flag=i; i<=num/2; ++i,flag=i) { flag = i; if(num%i==0) { printf("%d is not prime\n",num); ++flag; break; } } if(flag==i) printf("%d is prime\n",num); return 0; } int input() /* Integer value is returned […]

在C中运行时生成函数

我想在C中运行时生成一个函数。我的意思是我本来想分配一些内存,指向它并通过函数指针执行它。 我意识到这是一个非常复杂的话题,我的问题是天真的。 我也意识到有一些非常强大的库可以做到这一点(例如nanojit )。 但我想从基础知识开始学习这项技术。 知识渊博的人能否在C中给我一个非常简单的例子? 编辑: 下面的答案是伟大的,但这是Windows的相同示例: #include #define MEMSIZE 100*1024*1024 typedef void (*func_t)(void); int main() { HANDLE proc = GetCurrentProcess(); LPVOID p = VirtualAlloc( NULL, MEMSIZE, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); func_t func = (func_t)p; PDWORD code = (PDWORD)p; code[0] = 0xC3; // ret if(FlushInstructionCache( proc, NULL, 0)) { func(); } CloseHandle(proc); VirtualFree(p, 0, MEM_RELEASE); return […]

如何在头文件和c文件中声明函数指针?

我对如何在头文件中声明函数指针感到困惑。 我想在main和一个名为menus.c的文件中使用它,并在menus.h中声明它。我假设。 我们想要初始化以指向某个function。 它看起来像这样: void (*current_menu)(int); 我们在menus.c,menus.h和main中写了什么?

使用MACROS禁用function

在互联网上搜索了相当多的解决方案后,我决定在这里询问我的解决方案是否正常。 我正在尝试编写一个简单的模块化C日志库,旨在简化禁用,并特别帮助博士生和研究人员调试算法,尽可能减少日志记录系统的影响。 我的问题是我希望库的用户可以在编译时禁用日志系统,生成一个可执行文件,其中记录器的成本为0。 C代码看起来像这样: … logger_t * logger; result = logger_init(logger); if(result == -1) {…} … 这将简单地初始化记录器。 寻找一个示例代码我检查了assert.h头,但是在我的情况下,soulution会产生一个警告列表。 实际上,如果使用宏将logger_init()替换为0,则会导致变量logger从未使用过。 出于这个原因,我决定使用这种方法: int logger_init(logger_t *logger); #ifndef NLOG /* NLOG not defined -> enable logging */ int logger_init(logger_t *logger) { … } #else /* NLOG defined –> the logging system must be disabled */ #define logger_init(logger) (int)((logger = […]

C基本字符串返回函数

我仍然是C的新手。我仍然不了解指针。 我正在尝试创建一个返回String的方法。 这是function,它仍然不完整。 char getS(char *fileName){ FILE *src; if((src = fopen(fileName, “r”)) == NULL){ printf(“%s %s %s”, “Cannot open file “, fileName, “. The program is now ending.”); exit(-1); } char *get = ” “; //insert getting a random word here return(*get); } 而我正试着这样调用这个方法 char *article = getS(“articles.txt”); char *noun = getS(“nouns.txt”); char *verb = […]

将void *作为函数调用而不声明函数指针

我已经搜索过但找不到任何结果(我的术语可能已关闭)所以请原谅我,如果之前已经提出过这个问题。 我想知道是否有一种简单的方法可以在没有首先声明函数指针然后为函数指针指定地址的情况下将void*作为C函数调用。 即。 假设要调用的函数是void(void) void *ptr; ptr = ; ((void*())ptr)(); /* call ptr as function here */ 用上面的代码,我得到错误C2066:在VC2008中强制转换为函数类型是非法的 如果可能,具有返回类型和多个参数的函数的语法有何不同?

(如何)我可以内联特定的函数调用吗?

假设我有一个在程序的多个部分中调用的函数。 我们还要说我对该函数的特定调用是在一个性能极其敏感的代码段中(例如,循环迭代数千万次,每微秒计数一次)。 有没有办法可以强制编译器(在我的情况下为gcc )内联单个特定函数调用,而不是内联其他函数? 编辑:让我完全清楚:这个问题不是强迫 gcc(或任何其他编译器)内联所有函数调用; 相反,它是关于请求编译器内联对函数的特定调用 。

这两个地点有什么区别?

我有一个递归程序。 当printf用于该function时,它输出123,当在室外使用时,它输出0123。 #include fact(int); int main() { int x=3; fact(x); printf(“\n”); system(“PAUSE”); } int fact(int y) { if (y > 0) { fact(y-1); printf(“%d”,y); } //printf(“%d”,y); } 我没有同时使用printf 。 这个printf语句的位置有什么不同?