Является ли 'private' ключевым словом C? - PullRequest
17 голосов
/ 08 марта 2009

Являются ли "частными" или "общедоступными" ключевыми словами в ANSI C (или любом другом C в этом отношении) или они были добавлены только в C ++ (и Java, C #, ...)?

Ответы [ 3 ]

31 голосов
/ 08 марта 2009

private не является ключевым словом C89 или C99. См. C Программирование / Справочные таблицы на Wikibooks *.

Кроме того, C не имеет ничего общего с Java и C # (и, действительно, с C ++ тоже). Однако обратное неверно - C ++ выросла, например, из C.

* Требуется лучшая ссылка!
** На самом деле, C89 "заимствовал" ключевые слова const и volatile из C ++ . Аналогично, C99 «заимствовал» ключевое слово inline, а также добавил _Bool и _Complex (подобно C ++'s bool и complex соответственно) [нужное цитирование] .

11 голосов
/ 08 марта 2009

Не являются ключевыми словами C, но некоторые люди делают следующее:

#define public 
#define private static

Обновление:

Для тех, кто считает, что делать вышесказанное - плохая идея, я бы согласился. Но это объясняет, почему кто-то может подумать, что public или private являются ключевыми словами C.

Для тех, кто думает, что он не скомпилируется в C, попробуйте это:

#include <stdio.h>
#include <stdlib.h>

#define public
#define private static

private void sayHello(void);

public int main(void) {
    sayHello();

    return (EXIT_SUCCESS);
}

private void sayHello(void) {
   printf("Hello, world\n");
}

Для тех, кто думает, что он не будет компилироваться в C ++, да, вышеуказанная программа будет.

Обновление:

Ну, на самом деле это неопределенное поведение из-за этой части стандарта C ++:

Блок перевода, который включает в себя заголовок не должен содержать макросов которые определяют имена, объявленные или определенные в этом заголовке. Не должен такой блок перевода определяет макросы для имена лексически идентичны ключевым словам.

Так что пример выше и ниже не обязывает делать что-то вменяемое в C ++, и это хорошо. Мой ответ по-прежнему полностью действителен для C (пока он не окажется неправильным! :-)).

В случае класса C ++ с закрытыми членами, вы можете сделать что-то подобное (считается злоупотреблением), например:

main.c

#include <cstdlib>
#define private public
#include "message.hpp"

int main() {
    Message msg;

    msg.available_method();
    msg.hidden_method();

    return (EXIT_SUCCESS);
}

message.hpp

#ifndef MESSAGE_H
#define MESSAGE_H

#include <iostream>

class Message {
  private: 
      void hidden_method();

  public: 
      void available_method();
};

inline void Message::hidden_method() {
    std::cout << "this is a private method" << std::endl;
}

inline void Message::available_method() {
    std::cout << "this is a public method" << std::endl;
}

#endif
0 голосов
/ 08 мая 2012

static не похоже на private , поскольку вы не можете прочитать статическую переменную даже в конструкторе класса (функция, которая инициирует членов структуры на языке Си).

Вы можете использовать статические переменные только в той части кода, где они были определены (в функции, структуре, ...).

...