множественное определение в связывании - PullRequest
0 голосов
/ 01 ноября 2018

Я новичок в Linking, допустим, у меня есть два .c файла

file1.c is

#include <stdio.h>
#include "file2.c"


int main(int argc, char *argv[]) 
{
    int a = function2();
    printf("%d",a);
    return 0;
}

и file2.c равно

int function2() 
{ 
    return 2018;
}

при компиляции возникает ошибка компоновщика, которая является множественным определением функции 2, но я определяю функцию только один раз в файле2.c?

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Попробуйте что-то вроде этого:

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

int main(int argc, char *argv[]) 
{
    int a = function2();
    printf("%d",a);
    return 0;
}

file2.h:

extern int function2(void);

и file2.c равно

#include "file2.h"

int function2(void) 
{ 
    return 2018;
}

А затем связать это вместе.

0 голосов
/ 01 ноября 2018

Оператор #include "file2.c" эффективно включает содержимое file2.c в file1.c. Затем file1.c компилируется так, как если бы оно содержало:

int function2() 
{ 
    return 2018;
}

Эти строки определяют function2; они сообщают компилятору: «Вот function2, создайте для него код». Поскольку эти строки фактически появляются в file1.c и file2.c, ваша программа имеет две копии function2.

Вместо этого вы должны создать file2.h, который содержит:

int function2();

Эта строка сообщает компилятору: «Существует функция с именем function2, но ее определение где-то еще».

Затем в file1.c используйте #include "file2.h" вместо #include "file2.c". Это сообщит компилятору во время компиляции file1.c, что ему нужно знать, чтобы скомпилировать вызов function2. Компилятор будет иметь объявление , в котором он нуждается, но у него не будет определения , которое не нужно в file1.c.

Также в file2.c вставить #include "file2.h". Тогда file2.c будет содержать как объявление function2 (из file2.h), так и определение function2 (из фактических строк в file2.c). Цель этого состоит в том, чтобы компилятор мог видеть и объявление, и определение во время компиляции file2.c, поэтому он может предупредить вас, если есть опечатка, которая делает их несовместимыми.

Кроме того, в C вы должны использовать int function2(void) вместо int function2(). По историческим причинам последний оставляет параметры неуказанными. Использование (void) сообщает компилятору об отсутствии параметров.

0 голосов
/ 01 ноября 2018

Вы должны создать заголовочный файл, "file2.h", с:

int function2(void);

и файл "file2.c" с функцией: "file2.h" с:

#include "file2.h"

int function2(void) 
{ 
    return 2018;
    ...
} 

Тогда в вашем главном вы должны включить заголовок с:

#include "file2.h"

Следите за тем, чтобы все эти файлы находились в одной папке, чтобы избежать проблем со связью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...