Ошибочно использовать extern в C среди двух кодов - PullRequest
0 голосов
/ 27 июня 2018

Структура моих кодов выглядит так:

passivertm_formal.c:

#include "CPML_profile.c"
int main(int argc, char* argv[])
{
    int n1,n2;
    float *p1,*p2;
    n1=1;
    n2=2;
    p1=(float*)calloc(n1,sizeof(float));
    p2=(float*)calloc(n2,sizeof(float));
    CPML_profile(p1,p2);
    ...
}

CPML_profile.c:

#include <stdio.h>
#include <math.h>
void CPML_profile(float *p1, float *p2)
{
  extern int n1,n2;
  ...
}

Но когда я компилирую два кода, появляется сообщение об ошибке:

CPML_profile.o: In function `CPML_profile':
CPML_profile.c:(.text+0x0): multiple definition of `CPML_profile'
passivertm_formal.o:passivertm_formal.c:(.text+0x0): first defined here
passivertm_formal.o: In function `CPML_profile':
passivertm_formal.c:(.text+0x13): undefined reference to `n1'
passivertm_formal.c:(.text+0x1b): undefined reference to `n2'
CPML_profile.o: In function `CPML_profile':
CPML_profile.c:(.text+0x13): undefined reference to `n1'
CPML_profile.c:(.text+0x1b): undefined reference to `n2'

Кто-нибудь может понять, почему это происходит?

1 Ответ

0 голосов
/ 27 июня 2018

Во-первых, не включайте файл .c, просто создайте файл .h с прототипом функции:

#include "CPML_profile.h"

.h содержит:

#pragma once
void CPML_profile(<... function parameters ...>);

Теперь n1 и n2 не являются глобальными переменными. Это локальные переменные из процедуры main (которая ничем не отличается от другой процедуры, кроме того факта, что это точка входа вашей программы), вы не можете получить к ним доступ из другой процедуры или файла.

Переместить объявление n1 и n2 в глобальную область (но я бы не рекомендовал это решение)

int n1,n2;

int main(int argc, char* argv[])
{

в вашем случае, почему бы не передавать их в качестве параметров, поскольку вы уже передаете массив с плавающей точкой:

p1=calloc(n1,sizeof(float));
p2=calloc(n2,sizeof(float));  # BTW: another issue: you're not allocating p2 but p1 twice: ouch!!
CPML_profile(p1,p2,n1,n2);

сейчас:

void CPML_profile(float *p1, float *p2, int n1, int n2)
{

Это решение намного чище и позволяет использовать функцию в многопоточной среде / без необходимости использования глобальных символов для n1 и n2

Разные советы: компиляция с предупреждениями, вероятно, показала бы, что вы используете p2 неинициализированным.

...