В C что означает «public», когда он помещается перед глобальной переменной? - PullRequest
4 голосов
/ 09 августа 2009

Я просматриваю исходный код Unix-инструмента Марка Нудельмана "less", и в начале файла main.c есть много следующего:

public int  logfile = -1;
public int  force_logfile = FALSE;
public char *   namelogfile = NULL;

и т.д.. в глобальной области, перед определением main (),

Что означает публика в этом контексте? И что более важно, где я могу найти эту информацию сам? Я искал, используя бесчисленные комбинации запросов, и не смог найти эту информацию или какую-либо основательную ссылку на C.

Ответы [ 4 ]

21 голосов
/ 09 августа 2009

В файле less.h есть ваш ответ:

#define public      /* PUBLIC FUNCTION */

Кажется, что public используется только как маркер для публичных / глобальных функций и переменных. При компиляции он расширяется до нуля.

Как найти эту информацию?

  1. Поиск .c файла сверху, где находится идентификатор, который вы хотите получить больше информации о
  2. Если вы не нашли никакого объявления, поищите директивы #include
  3. Откройте любой включенный файл и найдите объявление о том, что вы ищете
  4. Повторите с шага два для каждого включенного файла

В данном случае это было довольно просто.

4 голосов
/ 09 августа 2009

Это не имеет ничего общего с Си как таковой. Если вы загляните во включаемый файл less.h, то увидите, что автор определил ряд инструкций препроцессора. Некоторые из них, такие как «public», наиболее вероятны для удобства чтения. Например:

 /*
 * Language details.
 */
#if HAVE_VOID
#define VOID_POINTER    void *
#else
#define VOID_POINTER    char *
#define void  int
#endif
#if HAVE_CONST
#define constant    const
#else
#define constant
#endif

#define public      /* PUBLIC FUNCTION */

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

Подобные приемы предварительной обработки могут даже использоваться умными способами, чтобы один исходный код компилировался на разных языках (таких как C ++ и Java). Это не то, что вы должны делать, но это возможно.

Параметры, такие как HAVE_VOID, которые вы видите в примере из less.h выше, обычно указываются как параметры компилятора (фактически препроцессора) во время компиляции. Поэтому, если у вас есть компилятор и версия C, которая поддерживает ключевое слово void , вы скомпилируете свой исходный код:

g ++ -g -DHAVE_VOID -Wall myprog.C -o MyProg

Везде, где автор использует VOID_POINTER в источнике, компилятор фактически будет рассматривать его как:

void * 

Если вы не указали HAVE_VOID, компилятор вместо этого будет использовать

char * 

, что является разумной заменой.

СОВЕТ: Проверьте параметры вашего компилятора, чтобы увидеть, есть ли у вас возможность просто обработать исходные тексты. Таким образом, вы можете посмотреть фактический источник, который отправляется компилятору.

2 голосов
/ 09 августа 2009

Определение public как пустой макрос препроцессора было рассмотрено в других ответах. Чтобы найти определение, вы, вероятно, захотите использовать такой инструмент, как ctags / etags или cscope. (Существует много инструментов для сканирования исходного дерева для генерации этой информации.) Например, вы можете найти определение public в строке 55 less.h, вызвав:

$ ctags -dtw *.c *.h
$ vi -t public

Или просто запустите ctags, прежде чем начать что-либо редактировать. Когда вы видите определение, которое вы не понимаете, наведите на него курсор и введите ^] (это правая квадратная скобка, которая будет работать в редакторах, похожих на vi.)

1 голос
/ 09 августа 2009

C не имеет ключевого слова public, поэтому это, вероятно, макрос, определенный где-то в менее исходном коде.

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