使用c99编译出warning: implicit declaration of function ‘popen’

问题:

ubuntu中使用gcc 4.6.3编译代码。

源代码中使用了popen()和pclose()函数,当源代码没使能c99选项前,编译结果不报warnings;使能c99选项后(gcc -std=c99),编译时出现warnings:

controller.c:482:5: warning: implicit declaration of function ‘popen’ [-Wimplicit-function-declaration]
controller.c:482:18: warning: initialization makes pointer from integer without a cast [enabled by default]

解决办法:

1. 源代码中已经包含了popen()和pclose()的头文件#include <stdio.h>,这也是不加-std=c99时不报warnings的原因;

2. 将-std=c99替换为-std=gnu99;重新编译,warning消失。


问题解决。


<think>我们正在处理一个C语言编译警告问题。用户遇到的警告是“implicit declaration of function 'Set_Servo_Angle'”(注意:用户输入的函数名中有空格,但C函数名不能有空格,实际应为下划线或驼峰式,这里可能是笔误。我们假设函数名为Set_Servo_Angle,使用下划线)。 警告原因:在C99标准中,函数在使用之前必须声明或定义。如果编译器在调用函数之前没有看到该函数的声明或定义,就会发“隐式声明”的警告。 解决方案: 1. 在调用函数之前提供函数声明(原型)或定义。 2. 确保函数声明或定义在调用点之前可见。 具体步骤: a) 如果该函数是用户自己定义的,确保在调用它的函数之前定义它(即把定义放在调用函数之前),或者在调用之前声明函数原型。 b) 如果该函数来自某个头文件,确保包含了相应的头文件。 假设用户使用的是自定义函数Set_Servo_Angle,那么可以这样做: 方法1:在调用之前定义函数(适用于函数体较短的情况) ```c // 在调用之前定义函数 void Set_Servo_Angle(int servo_id, float angle) { // 函数实现 } int main() { // 调用函数 Set_Servo_Angle(1, 90.0); return 0; } ``` 方法2:在调用之前声明函数原型 ```c // 函数声明(原型) void Set_Servo_Angle(int servo_id, float angle); int main() { Set_Servo_Angle(1, 90.0); return 0; } // 函数定义可以在后面 void Set_Servo_Angle(int servo_id, float angle) { // 函数实现 } ``` 方法3:如果函数来自外部文件(比如在另一个.c文件中定义),则需要在当前文件中声明函数原型(通常在头文件中声明,然后包含该头文件) 例如,在头文件servo.h中声明: ```c // servo.h void Set_Servo_Angle(int servo_id, float angle); ``` 然后在当前源文件中包含该头文件: ```c #include "servo.h" ``` 注意:函数声明(原型)应该包含返回类型和参数类型,这样编译器才能进行正确的检查。 另外,用户提到C99标准。在C99中,隐式声明是不允许的(在C89中,如果函数没有声明,编译器会假设返回int类型,但C99移除了这一特性),因此必须显式声明。 如果用户没有提供函数声明,且没有包含正确的头文件,就会导致这个警告。因此,解决的关键就是让函数在调用点之前有声明或定义。 同时,检查函数名称的拼写和大小写是否一致。用户问题中的函数名有空格,实际C函数名不能有空格,所以可能是Set_Servo_Angle(下划线)或SetServoAngle(驼峰)等。确保声明、定义和调用时名称完全一致。 最后,如果用户使用的是第三方库,确保已经正确安装了该库,并在编译时链接了相应的库文件(如使用gcc编译时,可能需要用-l选项指定库)。 总结:添加函数声明或定义,确保在调用前可见。 相关问题: 1. C99标准与之前的标准在函数声明上有什么不同? 2. 如何避免函数未声明就使用? 3. 在C语言中,函数声明和定义的区别是什么? </think>### C99标准下解决 "implicit declaration of function Set_Servo_Angle" 警告的方法 在C99标准中,`implicit declaration of function` 警告表示编译器在调用函数前未找到其声明或定义。这违反了C99严格类型检查规则(C99标准
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值