2016-04-15 6 views
1

Привет Я разработчик C++, теперь я занимаюсь программированием на C.Где я могу объявить глобальную переменную в c-программе, будь то в заголовке или исходном файле

Мой вопрос: в каком месте лучше объявить глобальную переменную в программе c. Заголовок или исходный файл (если моя глобальная переменная не используется в других файлах)?

Я хочу, чтобы такая переменная, как частная переменная, в C++.

ответ

2

Предполагая, что ваша переменная глобальна и не статична.

Вам необходимо объявить его в файле заголовка. Для этого мы используем ключевое слово extern. Как указано в комментариях, эти ключевые слова не нужны, но большинство пользователей C предпочитают использовать его в заголовках, это соглашение.

stackoverflow.h:

#ifndef STACHOVERFLOW_H 
#define STACHOVERFLOW_H 

extern int my_var; 

#ifndef 

И вы инициализировать его в исходном файле. (Использование ключевого слова extern запрещено, если вы хотите указать значение инициализации).

stackoverflow.c

#include "stackoverflow.h" 

int my_var = 50; 

Не помещайте значение инициализации в заголовке, или вы получите ошибку компоновщика, если заголовок используется, по крайней мере в два раза.

Теперь вы можете использовать свою переменную в любом другом модуле, включив заголовок.

main.c

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

int main() 
{ 
    printf("my_var = %d\n", my_var); 
    return 0; 
} 

В том числе заголовка «stackoverflow.h» в «stackoverflow.c» способ получить уверено определение в исходных декларациях спичечного файла в заголовочном файле. Это позволяет иметь ошибки, как только компиляция вместо иногда критических ошибок компоновщика.

Редактировать: Это вовсе не способ сделать переменную «приватной». Вы должны использовать статическую переменную, чтобы сделать ее «частной». См. R Sahu's answer

+0

Как только мы включим stackoverflow.h в stackoverflow.c. Компилятор скопирует все содержимое в stackoverflow.c правильно? то почему это должно быть extern?Извините, если мой вопрос глупый –

+0

да, вы правы Bhavith C Acharya. Это указывает на мой ответ? – shafeeq

+0

Извините, дорогой @ user3302647 Я не получил ответа. Мой вопрос в том, что нужно положить 'extern int my_var' в stackoverflow.h –

1

, какое место лучше объявить глобальную переменную в С программой

В исходном файле.

Если он не используется в других файлах, а затем использовать static

+0

@ user332647 переменная 'static' в * .c или * .h? –

+0

добавьте его в * .c файл – shafeeq

0

Вообще то, что вы можете сделать, это определить переменную в исходном файле, как int g_foo;, затем ссылаться на этот глобальный в других файлах с экстерном, как extern int g_foo; do_sth(g_foo);. Вы можете поместить объявление extern int g_foo; в файл заголовка и включить его в другие исходные файлы. Не рекомендуется определять определения данных в файлах заголовков.

1

Если вы собираетесь использовать глобальные переменные в нескольких файлах .c, лучше объявить их в .h файлах. Однако, если вы хотите сохранить переменные как private данных членов классов в C++, лучше будет предоставлять доступ к глобальным данным через функции.

Вместо

extern int foo; 

Использование

int getFoo(); 
void setFoo(int); 

Такого рода мимике спецификаторов private доступа к переменным-членам класса.

+0

@ R саху. Предположим, что в моем заголовке test.h я объявил переменную 'extern int a 'и изменил значение' a' в test.c. и тот же заголовок, который я включил в test2.c, и если я попытаюсь использовать 'a' в test2.c, мой' a' будет храниться с измененным значением или свежим 'a' –

+0

Да, конечно. –

0

Если вы хотите быть глобальной (внешняя связь), вы должны положить его в .h файл. И это одна из лучших практик, я думаю:

public_header.h

#ifdef YOUR_SOURCE 
#define EXTERN 
#else 
#define EXTERN extern 
#endif 

EXTERN int global_var; 

your_source.c

//your source makes definition for global_var 
#define YOUR_SOURCE 
#include <public_header.h> 

other_source.c

#include <public_header.h> //other sources make declaration for global_var 

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

your_souce.c

static int private_var; 
+0

почему он должен быть статичным в source.c почему не может быть нестационарным, есть ли какая-нибудь причина? , Это потому, что сделать его локальным для этого файла? –

+0

Да, как я уже упоминал, если вы хотите, чтобы он был закрытым (не видно из другого источника файла), так что ему нужно идти с 'static' – Nik

1

Вы не должны размещать глобальные непостоянные переменные в любом месте. Global, как указано в объявлении extern и доступно для всего проекта. Необходимость этого всегда берет начало из плохой программы, период. Это верно для C и C++.

Исключение составляет const переменные, которые идеально подходят для обмена несколькими файлами.

В случае, если вам нужны параметры области, они должны быть объявлены в .c файле и всегда равны static. Не путайте их для «глобальных», потому что они являются локальными для единицы перевода, где они объявлены. More info about how static file scope variables can make sense.

отметить также стандартные будущие направления языка C:

объявляя идентификатор с внутренним связыванием в области видимости файла без статического класса хранения спецификатор является устаревшим особенность.

Так что, если вы не используете static, ваш код может не компилироваться в следующей версии стандарта C.

+0

OMG приятное объяснение –

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