【问题标题】:C conflicting types in headers and undeclared variables?标头和未声明变量中的C冲突类型?
【发布时间】:2017-07-15 16:29:42
【问题描述】:

我收到了错误:

'complex' 的冲突类型。(complex.h 的第 4 行)以前的'complex' 声明在这里。 (complex.h 的第 4 行)

还有

num1、num2 和 ans 未声明。 (在这个函数中第一次使用)

在主程序中。

#include <stdio.h>

#include "boolean.h"
#include "complex.h"
#include "complex_IO.h"
#include "complex_Arith.h"


int main (void){
    boolean quit=FALSE;
    boolean showmenu=TRUE;
    int menu_sel;
    while (!quit){
            if (showmenu){
                    printf("1 Add.\n");
                    printf("2 Subtract.\n");
                    printf("3 Multiply.\n");
                    printf("4 Conjugate.\n");
                    printf("5 Negate.\n");
                    printf("6 Toggle Menu.\n");
                    printf("7 Quit.\n");
                    printf("Enter Selection:");
                    scanf("%d",&menu_sel);
            }
            else{
                    printf("Enter Selection (4 to turn menu on):");
                    scanf("%d",&menu_sel);
            }
            switch (menu_sel){

                case 1: num1=Read_Complex();
                        num2=Read_Complex();
                        ans=Add_Complex(num1,num2);
                        Write_Complex(ans);
                        break;
                case 2: num1=Read_Complex();
                        num2=Read_Complex();
                        ans=Subtract_Complex(num1,num2);
                        Write_Complex(ans);
                        break;
                case 3: num1=Read_Complex();
                        num2=Read_Complex();
                        ans=Multiply_Complex(num1,num2);
                        Write_Complex(ans);
                        break;
                case 4: num1=Read_Complex();
                        num2=Read_Complex();
                        ans=Conjugate_Complex(num1);
                        Write_Complex(ans);
                        break;
                case 5: num1=Read_Complex();
                        num2=Read_Complex();
                        ans=Negate_Complex(num1);
                        Write_Complex(ans);
                        break;
                case 6: showmenu=!showmenu;
                        break;
                case 7: quit=TRUE;
                        break;
                default: printf("%d is not a valid option.\n", menu_sel);
            }
    }
}

我不知道是否需要所有头文件,但这里是 complex.h:

typedef struct {
    int real;
    int img;
} complex;

【问题讨论】:

  • 其他头文件是否包含complex.h?
  • 是的。 Complex_Arith.h 和 Complex_IO.h 都可以
  • 那么,你有问题......对吗?为了清楚起见,检查预处理的输出。
  • 所以即使 complex_arith.c 和 complex_io.c 都使用 complex.h 也不应该在其他头文件中?
  • 如果可行,您只能在两者中包含complex.h

标签: c function types header


【解决方案1】:

complex.h(我假设这是一个自定义标题而不是官方标题)中,您需要添加标题保护。这可以防止它被complex_IO.hcomplex_Arith.h 处理两次。阅读here了解更多信息。

/* complex.h */
#ifndef COMPLEX_H_INCLUDED__
#define COMPLEX_H_INCLUDED__

typedef struct {
    int real;
    int img;
} complex;

#endif

您还应该重命名它(或直接指向它在文件系统中的位置),因为它 already exists 作为标准头。

对于您的其他错误,程序中未定义变量导致编译错误。

【讨论】:

  • 哦,我明白了。那行得通。您对未定义的变量有任何想法吗?如果我尝试在主程序中定义它们,它会更加破坏它
  • 为此避免保留符号可能更安全:_COMPLEX_H_INCLUDED_。最好使用COMPLEX_H_INCLUDED__ 或干脆使用COMPLEX_H_INCLUDED
  • 是的,使用 complex.h 作为自定义库通常是一个糟糕的主意。已更新,谢谢。
【解决方案2】:

关于第二个错误:

num1、num2 和 ans 未声明。 (在这个函数中第一次使用)

这些变量根本没有在任何地方声明。

你应该在main的开头声明它们:

int main (void){
    boolean quit=FALSE;
    boolean showmenu=TRUE;
    int menu_sel;

    complex num1, num2, ans;   // <<<<<<<<<<<<<<
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多