没有#ifndef的C头文件仍可正常工作......为什么?

时间:2018-02-22 00:54:37

标签: c

为什么我没有收到错误消息? 我有三个名为DataType.h,printInt.h,printStr.h和一个myApp.c的头文件。

DataType.h

    typedef int Integer;
    typedef char String;

printInt.h

    #include "DataType.h"
    void printInt(Integer);

printInt.c

    #include "printInt.h"
    #include <stdio.h>
    void printInt(Integer number){
        printf("%d\n", number);
    }

printStr.h

    #include "DataType.h"
    void printStr(String*);

printStr.c

   #include "printStr.h"
   #include <stdio.h>
   void printStr(String *str){
       printf("%s\n", str);
   }

myApp.c

    #include "printStr.h"
    #include "printInt.h"
    Integer main(void){
        printInt(20);
        printStr("hello");

        return 0;
    }

显然,我已经将DataType.h包含了两次,并且我没有使用#ifndef来避免重新定义Integer和String。请有人告诉我如何获取错误消息以证明该指令正常工作。

   #ifndef __DATATYPE_H
   #define __DATATYPE_H
      typedef int Integer;
      typedef char String;
   #endif

无论是否有#ifndef,gcc编译器(版本5.4.0)都不会生成任何错误消息。怎么了?

1 个答案:

答案 0 :(得分:1)

typedef的定义和函数原型可以根据需要多次出现。例如:

typedef int lala;
typedef int lala;

void somePrototype();
void somePrototype();

int main() {
    return 0;
}

编译得很好:https://ideone.com/4EjfaR

尝试将函数的定义添加到头文件中。然后,您将看到重新定义错误,并需要一个标题保护。