2013-12-06 2 views
1

У меня есть исходный файл source.c и общедоступный заголовочный файл source.h. Source.c содержат sНесколько файлов заголовков в один исходный файл?

#include "source.h" 

Я не хочу, чтобы все функции в source.c быть публичным, поэтому я хочу еще один заголовочный файл под названием priv_source.h, который ссылается на некоторые частные функции в source.c.

Компилятор понимает, что priv_source.h также является файлом заголовка source.c или мне нужно сделать еще один c-файл с именем priv_source.c?

+2

Почему вы включаете 'source.c' в' source.h'? –

+0

Это было неправильно, это должно быть так, как я отредактировал сейчас ... – theva

+1

Обычно файл 'source.h' не содержит деклараций для каждой функции, определенной в' source.c', только те функции, которые должны быть разделены с другими исходными файлами (единицы перевода). Для любой функции из 'source.c', которую вы не хотите экспортировать из' source.c', не объявляйте ее в 'source.h'. Если функции требуется декларация (потому что она используется до ее определения), просто объявите ее в соответствующем месте в 'source.c'. Кроме того, функции, предназначенные для того, чтобы быть закрытыми для 'source.c', обычно объявлялись бы с помощью' static'. –

ответ

6

ли компилятор понимает, что priv_source.h также является заголовочный файл source.c или я должен сделать еще один с-файл с именем priv_source.c?

Компилятор C не делает такого подключения: все файлы, заголовки и источники не связаны с компилятором. Все, что он знает, это имя (имена) единиц перевода, которое необходимо обработать (например, имена ваших .c-файлов) и имена заголовков, которые включают эти единицы перевода.

Обычно разделение деклараций осуществляется в двух частях - общественных и частных. В таких случаях, однако, частный заголовок будет включать в себя публичный, как это:

source.h

// Public declarations go here 
void public_function1(int, int); 
void public_function2(int, double, int); 

priv_source.h

#include "source.h" 
void private_function1(float); 
void private_function2(char*); 

source.c

#include "priv_source.h" 
+0

Это должно быть другим способом. Source.c содержит #include "source.h", извините – theva

+0

@theva OK, я удалил первую часть ответа и расширил вторую. – dasblinkenlight

0

В вашем вопросе есть две точки:

  1. Объявление функций помещается в заголовочные файлы, так что они могут быть , включенными в несколько исходных файлов, без явной необходимости в объявить в каждом исходном файле. Таким образом, только поместите эти объявления в заголовочный файл, который вы хотите получить в других файлах.
  2. Если какая-либо функция должна быть ограничена конкретным файлом, сделайте это определение функции как static. Как только вы определите функцию как static, она не будет видна снаружи для связи. Область этой функции будет ограничена одним и тем же модулем компиляции, обычно это файл только .
0

В c по умолчанию все функции являются общедоступными, поскольку функция, объявляемая внутри любого заголовка, может использоваться другим методом, если эта функция просто включает заголовок. Теперь, если вы явно объявляете такую ​​функцию, как статическое имя return_type (некоторые аргументы могут или не могут быть), тогда это не может быть доступ к стороне этого файла. Теперь нет такой привилегии, чтобы скрыть любую функцию, такую ​​как java, C++ и C# и т. Д. Возможно, это может быть я не уверен, что можно добиться, используя #if #elseif и #endif statement. Вы должны написать логику, если ваша функция присутствует в вашем коде, а затем введите #if. Потому что в заявлении #if, если условие не удовлетворяет, то после этапа препроцессора эта часть исчезнет из нашего кода, аналогичного комментариям в нашем коде. Смотрите, я не уверен, но могу быть. Спасибо asif aftab

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