2013-12-03 3 views
1

Я написал очень простую программу на C. Он компилируется и отлично работает. Но если добавить Экстерн Int й в functions.h вместо functions.c я получаю эту ошибкуОшибка компиляции при использовании extern

functions.c:3:12: error: use of undeclared identifier 'x' 
    return x/2; 
     ^
1 error generated. 

Я думал, что правильное место для экстерна в файле заголовок.

variables.h

int x = 10; 

functions.h

#include "variables.h" 

int calculate_items(int d); 

functions.c

extern int x; 

int calculate_items(int d) 
{ 
    return x/2; 
} 

main.c

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

int main() { 
printf("%d", calculate_items(5)); 
} 

ответ

2

Нет, вы не можете иметь инициализатор в заголовке.

Он не будет работать, как только более одного файла C будет содержать тот же заголовок, будет много объявлений.

Вы должны сделать переменную глобальной в одном из файлов C, например, в main.c, а затем просто extern int x; в файлах, которые должны получить доступ к нему (или в заголовках, что они могут #include, конечно).

В этом случае, так как переменная заканчивается «принадлежащий» файл main.c, вы, вероятно, следует добавить main.h заголовок, который имеет extern int x; декларацию и #include, что из functions.c и в других местах, которые нуждаются в переменной.

+0

Вы можете (и, вероятно, должны) поместить 'extern int x;' в заголовочный файл, который, как я предполагаю, означает, что OP означает «правильное место для extern в файле заголовка». – interjay

+0

@interjay именно это был мой вопрос. Проблема в том, что когда я помещаю extern в файл заголовка, я получаю ошибку для незаявленного идентификатора x – DRON

+0

@DRON Убедитесь, что вы включаете заголовочный файл везде, где вам нужно получить доступ к переменной. И сделайте так, как в этом ответе говорится о том, чтобы положить 'int x = 10' в файл C. – interjay

0

Если вы не ставите extern int x; в functions.c и functions.c не #include ничего, объявляющий x, как он должен знать, что x это?

Если вы ожидаете какого-либо неявного отношения между functions.h и functions.c, потому что у них обоих есть имена, такие как functions.*, тогда вы должны просто избавиться от этого ожидания.

Обычный способ сделать это, чтобы положить extern int x; в functions.h, то int x=10; в одном из .c файлов и #include "functions.h" из всех .c файлов, которые ссылаются на x, включая functions.c.

Смежные вопросы