1

有一个客户头文件包含一些简单的函数,并在两个不同的 .c 文件中使用这些函数

样本头文件.h

    #ifndef SAMPLEHEADER_H
    #define SAMPLEHEADER_H
    # include <stdio.h>
    
    add(int a, int b)
    {
    printf("Added value = %d\n", a + b);
    }
    multiply(int a, int b)
    {
    printf("Multiplied value = %d\n", a * b);
    }
    #endif

文件1.c

    # include <stdio.h>
    # include "sampleheader.h"
    int file 2();
    int main (){
    add (a, b);
    if some condition matches call -- file2 (a,b);
    return 0;
    }

文件2.c


    # include <stdio.h>
    int file2 (){
    multiply (a, b);
    return 0;
    }

我正在运行以下命令来编译代码:

    gcc  -c -o file1.o file1.c
    gcc  -c -o file2.o file2.c
    gcc  -o target file1.o file2.o

低于警告

warning: implicit declaration of function ‘multiply’ [-Wimplicit-function-declaration]

请帮助我避免“[-Wimplicit-function-declaration]”警告。

也试过 include "sampleheader.h"file2.c,然后它抛出一个错误" multiple definition of add; /tmp/ccTOAq1U.o:file2.c:(.text+0x0): first defined here'"

抱歉,如果这是重复性问题。

4

1 回答 1

2

这个:

警告:函数“乘法”的隐式声明 [-Wimplicit-function-declaration]

发生是因为对函数的调用multiply()出现在 中file2.c,但该文件既没有提供它自己的该函数声明,也没有提供#include您的头文件,其中出现的声明(和定义)multiply()

错误

'add'的多重定义;/tmp/ccTOAq1U.o:file2.c:(.text+0x0): 首先定义在这里'

确实包含标头时收到的错误是因为标头不仅包含函数声明,还包含函数定义(实现)。在整个程序的任何地方,任何给定的外部函数的定义都不得超过一个,并且将头文件包含在多个源文件中会导致其中存在多个函数定义的实例。

一般来说,C 头文件不应该包含函数或对象定义,绝对不应该包含外部函数或对象定义。这些进入常规源文件,只有它们的声明进入标题。例如,

样本头文件.h

#ifndef SAMPLEHEADER_H
#define SAMPLEHEADER_H

void add(int a, int b);
void multiply(int a, int b);

#endif

样本.c

#include <stdio.h>
#include "sampleheader.h"

void add(int a, int b) {
    printf("Added value = %d\n", a + b);
}

void multiply(int a, int b) {
    printf("Multiplied value = %d\n", a * b);
}

您将在每个想要调用其中声明的函数之一的源文件中包含该版本的标头,并且您将编译关联的源并将其包含在您的链接中。另请注意,您不需要将函数定义放在它们自己的文件中,甚至不需要将它们放在同一个文件中。它们只需要在一个可以编译和链接的源文件中。

另请注意,在 C99 及更高版本中,您必须声明函数的返回类型,如图所示。如果函数没有返回值,那么它应该声明void为它的返回类型。

于 2021-11-07T19:09:04.210 回答