一个C函数可以单独存在吗?
是的,一个C函数可以单独存在。C语言中的函数是一种程序模块,它可以被其他程序调用,从而实现代码的复用和模块化。函数可以独立地定义、编译和测试,然后被其他程序调用。
举个例子,如果你编写了一个计算两个数相加的函数,你可以将其保存在一个.c文件中,然后在一个主程序中调用这个函数来获取结果。这样的方式可以使得代码更加清晰和易于维护。
c语言中预编译指令可以用自己的函数吗?
在C语言中,预编译指令是在编译过程之前由预处理器处理的。预编译指令主要用于指导编译器在编译过程中进行不同的操作,例如宏定义、条件编译等。
预编译指令本身并不是函数,因此不能像函数一样进行调用和使用。预编译指令是在编译之前进行处理的,它们被用于在编译器编译源代码之前的文本替换和条件选择等操作。
如果您想定义和使用自己的函数,应该使用函数定义和函数调用的方式来完成,预编译指令无法实现这个功能。
原来在wincc6.2里的C脚本都不能编译了,全都报错?
你把大括号内的所有函数内容清空,再编译,如果还有错那只能重装了。
这不是脚本的原因,这是你安装的杀毒软件干扰了WINCC,诺顿杀毒才不会干扰。
痛苦了,你要把WINCC卸载了,然后彻底的清理垃圾和注册表,然后再安装,必须关闭杀毒和防毒软件哦。用WINCC就要关闭。做为一个工控软件的电脑,个人建议还是别安装杀毒软件。从使用习惯上规范自己的行为,避免中毒。另外隔一段时间更新一下补丁即可。
还有针对wincc,你可以使用项目移植程序将V6的程序移植到当前使用的版本。移植后再编译试试。
C语言的函数式宏定义,都可以用普通函数替换吗?为什么有的宏用函数实现就不正常了?
谢邀。
先说结论,并不是所有的函数式宏定义都能方便地(请注意“方便地”这个词)使用普通函数替换的,题主这么问,相信也是知道这一点的。
我的上个回答介绍了利用宏定义为C语言程序实现一套“超时机制”,这套机制没有使用普通函数,就是因为宏能够带来极大的便捷性。
不过遗憾的是,现在还在审核中(已经超过36小时了)。
避免“繁琐”的代码
不过,C语言中的“超时”机制并不难实现,上一个回答利用 usleep() 函数就建立了一套非常简易的“超时”功能,鉴于还没有审核通过,相关的C语言代码这里再写一次,请看:
上述C语言代码将阻塞等待 ready 位,但是并不会无限等待下去,而是最多等待 5000ms(即 5 秒)。这么处理虽然比较粗糙,但是的确能够解决“无限等待”问题,只不过仅仅等待一个 ready 位就需要写 3 行代码,如果需要做“超时”处理的地方比较多,整个C语言代码看起来就显得非常啰嗦了。
要是算上“超时”判断语句 if(get_cur_ms()-otime >= 5000)的话,就需要至少 4 行代码了。
程序员小明想到了将上面略微繁琐的“超时”C语言代码封装成函数,他想:封装后,以后若是想使用“超时”功能的话,只需一行函数调用就可以了,于是写出了类似下面这样的C语言代码:
小明定义的 cond_timeout() 函数接收两个参数:cond 参数表示需要等待的条件,timeout 参数表示最多等待的时间(单位ms)。如果在 timeout 时间内 cond 条件仍然没有成立,则 cond_timeout() 函数返回 1 表示“等待 cond 已超时”,否则返回 0 表示“成功等待到了 cond 条件”。
定义好 cond_timeout() 函数后,小明将上一节等待 ready 位的“超时”C语言代码:
修改为:
修改后的C语言代码的确更加简洁了,但是好用吗?我们编译这段代码并执行:
怪,thread() 线程函数明明在 2 秒后就将 ready 置位了,怎么还是输出了 “time out”呢?小明对此困惑不已。
解析
其实小明遇到的问题很像脑筋急转弯,如果读者和小明一样感到困惑,一定是因为“没反应过来”。cond_timeout() 函数没有像小明的预期一样工作的原因很简单:cond 参数只是 cond_timeout() 函数被调用的时候的状态,之后线程函数 thread() 无论如何修改 ready,也不会影响到 cont_timeout() 函数里的 cond。
那上面的“超时”C语言代码就不能封装,想用时,就只能一行一行写了?当然不是,将“超时”代码封装为函数不合适,还可以封装成宏:
上面这段C语言代码比较简单,值得说明的一个小技巧是将 {} 放入 (),如此一来,整个 cond_timeout 宏就相当于一条语句,这是 Linux 内核中相当常用的宏定义方法。
cond_timeout 宏 __cond 条件成立,或者等待__cond 条件成立时间超过__timeout,都会到达 (!(__cond))这一行 此时:
显然,如果这时 cond 成立了,cond_timeout 宏返回的就是 0 表示“等待 cond 条件没有超时”,否则 cond_timeout 宏返回 1 表示“未能等到 cond 条件成立,超时了”。
现在再将 cond_timeout 写入 main 函数,测试其是否可以正常工作,修改后的C语言代码如下,请看:
编译并执行这段C语言代码,得到如下结果:
因为 thread() 函数 2 秒后将 ready 置位了,所以 cond_timeout 宏没有返回超时。现在将 thread() 函数里的 sleep(2) 改为 sleep(6),相关C语言代码如下,请看:
编译并执行修改后的C语言代码,得到如下结果:
一切与预期一致。
小结
从本节可以看出,define 宏定义有时可以做到函数无法做到的事情。其实想想也能够明白,define 宏定义只是将C语言代码暂时“打包”,如果宏被调用,编译器就将包裹展开,这么看来,define 宏定义实际上只是将若干行代码取了一个名字而已。我们使用 gcc -E 命令获取编译器预处理后的C语言代码:
# gcc -E t.c
得到如下结果:
能够看出,define 宏定义 cond_timeout 本身并没有生成相关的预处理代码,反而在其被调用的地方,编译器将宏的代码直接展开了,这一点和函数是不同的。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

