[英]Conflicting types and previous declaration of x was here…what?
I've been teaching myself C for a few months when I have time, and I have run into a problem I am not sure how to fix. 当我有时间的时候,我一直在教自己C几个月,我遇到了一个问题我不知道如何修复。
Specifically, when I try to compile this using gcc, I get: 具体来说,当我尝试使用gcc编译它时,我得到:
geometry.c:8: error: conflicting types for ‘trapezoid’ geometry.c:7: note: previous declaration of ‘trapezoid’ was here geometry.c:48: error: conflicting types for ‘trapezoid’ geometry.c:7: note: previous declaration of ‘trapezoid’ was here geometry.c:119: error: conflicting types for ‘trapezoid_area’ geometry.c:59: note: previous implicit declaration of ‘trapezoid_area’ was here geometry.c: In function ‘cone_volume’: geometry.c:128: error: called object ‘3.14100000000000001421085471520200371742248535156e+0’ is not a function geometry.c: In function ‘cylinder_volume’: geometry.c:136: error: called object ‘3.14100000000000001421085471520200371742248535156e+0’ is not a function
Now, I think I may need to typecast the functions, but again, I am not sure. 现在,我想我可能需要对这些功能进行类型转换,但同样,我不确定。
It looks like it wants to read PI, which I had defined as 3.141, as a function. 看起来它想要读取我定义为3.141的PI作为函数。 Is there a way I can avoid using the magic number 3.141 (though it's much less of a magic number than others)?
有没有办法可以避免使用魔法数字3.141(虽然它比其他数字少得多)?
//Geometric formulae
#include <stdio.h>
#include <math.h>
#define PI 3.141
float trapezoid(float b1, float b2, float h);
int trapezoid();
float sphere_volume(float r);
int sphere();
float cone_volume(float r, float h);
int cone();
float pyramid_volume(float b, float h);
int pyramid();
float cylinder_volume(float r, float h);
int cylinder();
int main(void) {
char selection = 0;
while(selection != 'q') {
printf("\t--Geometric Formulas--\n");
printf("\tSelection an option from the menu: ");
scanf("%c", & selection);
switch(selection) {
case 1: //Trapezoid area
printf("%d", trapezoid());
break;
case 2: //Sphere volume
printf("%d", sphere());
break;
case 3: //Cone volume
printf("%d", cone());
break;
case 4: //Pyramid volume
printf("%d", pyramid());
break;
case 5: //Cylinder volume
printf("%d", cylinder());
break;
default:
break;
}
}
}
// --Shape Menus--
//Trapezoid
int trapezoid() {
float h = 0, b1 = 0, b2 = 0;
float traparea;
printf("\tTrapezoid base 1: ");
scanf("%3f", &b1);
printf("\tTrapezoid base 2: ");
scanf("%3f", &b2);
printf("\tTrapezoid height: ");
scanf("%3f", &b2);
traparea = trapezoid_area(b1, b2, h);
printf("\tTrapezoid Area: %3f\n", traparea); }
//Sphere
int sphere() {
float r = 0;
float spherevol;
printf("\tSphere radius: ");
scanf("%f", &r);
spherevol = sphere_volume(r);
printf("\tSphere volume: %3f\n", spherevol); }
//Cone
int cone() {
float r = 0, h = 0;
float conevol;
printf("\tCone radius: ");
scanf("%f", &r);
printf("\tCone height: ");
scanf("%f", &h);
conevol = cone_volume(r, h);
printf("\tCone volume: %3f\n", conevol); }
//Pyramid
int pyramid() {
float b = 0, h = 0;
float pyramidvol;
printf("\tPyramid base: ");
scanf("%f", &b);
printf("\tPyramid height: ");
scanf("%f", &h);
pyramidvol = pyramid_volume(b, h);
printf("\tPyramid volume: %3f\n", pyramidvol); }
//Cylinder
int cylinder() {
float r = 0, h = 0;
float cylindervol;
printf("\tCylinder radius: ");
scanf("%f", &r);
printf("\tCylinder height: ");
scanf("%f", &h);
cylindervol = cylinder_volume(r, h);
printf("Cylinder volume: %3f", cylindervol); }
// --Geometric Formulas--
//Trapezoid Area Computation
float trapezoid_area(float b1, float b2, float h) {
return ((b1 + b2) * h) / 2; }
//Sphere Volume Computation
float sphere_volume(float r) {
return ((pow(r,3)) * (4 * PI)) / 3; }
//Cone Volume Computatioin
float cone_volume(float r, float h) {
return ((PI(pow(r,2)) * h)) / 3; }
//Pyramid Volume Computation
float pyramid_volume(float b, float h) {
return (b * h) / 3; }
//Cylinder Volume Computation
float cylinder_volume(float r, float h) {
return (PI(pow(r,2))) * h; }
Any of them that say there was an 'implicit' definition: this can be solved by pre-declaring it. 他们中的任何一个都说有一个“隐含的”定义:这可以通过预先声明来解决。 As an example, you pre-declared float trapezoid and int trapezoid , but you didn't pre-declare trapezoid_area .
例如,您预先声明了float trapezoid和int trapezoid ,但是您没有预先声明trapezoid_area 。 As others pointed out, you also can't overload in C as you can in C++.
正如其他人所指出的那样,你也不能像在C ++中那样在C中重载。
In a few areas you're trying to do implicit multiplication -- eg, PI(pow(r,2)) should be PI * (pow(r,2)) . 在一些领域,你试图进行隐式乘法 - 例如, PI(pow(r,2))应该是PI *(pow(r,2)) 。
The errors you're seeing are because you're defining the same function twice with different signatures 您看到的错误是因为您使用不同的签名定义了两次相同的功能
float trapezoid(float b1, float b2, float h);
int trapezoid();
Based on your other definitions it looks like the first trapezoid
functions should be named trapezoid_volume
根据您的其他定义,看起来第一个
trapezoid
函数应该命名为trapezoid_volume
float trapezoid_volume(float b1, float b2, float h);
int trapezoid();
C does not support function overloading. C不支持函数重载。 C++ does.
C ++可以。
And since you accidentally declared trapezoid_volume
as trapezoid
, you get a compiler error. 由于您不小心将
trapezoid_volume
声明为trapezoid
,因此会出现编译错误。
you defined twice function trapezoid. 你定义了两次函数梯形。 C isn't C++.
C不是C ++。 You can't define the same function with different signatures like you do in C++ using overloading features.
您不能像使用重载功能在C ++中那样使用不同的签名定义相同的函数。
#define PI 3.141
float trapezoid(float b1, float b2, float h);
int trapezoid();
I think you want 我想你想要的
float trapezoid_volume(...);
/* ^^^^^^^ */
To answer your question about defining PI
- pi is usually defined in math.h
(as M_PI
), but since it's not part fo the actual standard you might need to do some configuration to get it. 要回答关于定义
PI
的问题 - pi通常在math.h
定义(作为M_PI
),但由于它不是实际标准的一部分,因此您可能需要进行一些配置才能获得它。
For example, when using MSVC you need to define _USE_MATH_DEFINES
to get it. 例如,在使用MSVC时,您需要定义
_USE_MATH_DEFINES
来获取它。 See 看到
http://www.gnu.org/s/hello/manual/libc/Trig-Functions.html#Trig-Functions http://www.gnu.org/s/hello/manual/libc/Trig-Functions.html#Trig-Functions
for the GNU C library's information. 用于GNU C库的信息。
If your platform doesn't have it, you might want to throw something like the following into a header: 如果您的平台没有它,您可能希望将以下内容添加到标题中:
#ifndef
#define M_PI 3.14159265358979323846264338327
#endif
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.