Являются ли 'private' или 'public' ключевыми словами в ANSI C (или любой другой C, если на то пошло), или они были добавлены только в С++ (и Java, С#,...)?
Является ли 'private' ключевым словом C?
Ответ 1
private
не является ключевым словом C89 или C99. См. C Программирование/Справочные таблицы в Викиучебниках *.
Кроме того, C не имеет ничего общего с Java и С# (и, действительно, не с С++). Однако обратное неверно: например, С++ вырос из C.
* Лучшая ссылка нужна!
** Фактически, C89 "заимствовал" ключевые слова const
и volatile
из С++. Аналогично, C99 "заимствовал" ключевое слово inline
, а также добавил _Bool
и _Complex
(например, С++ bool
и complex
) [citation-needed].
Ответ 2
Ни ключевые слова 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");
}
Для тех, кто считает, что он не будет компилироваться в С++, да, указанная выше программа будет.
Обновление:
На самом деле это поведение undefined из-за этой части стандарта С++:
Блок перевода, который включает заголовок не должен содержать макросов которые определяют имена, объявленные или определенные в этом заголовке. И такой единицы перевода определяют макросы для имена, лексически идентичные ключевым словам.
Таким образом, пример выше и ниже не требуется делать что-то разумное на С++, что хорошо. Мой ответ по-прежнему полностью применим для 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
Ответ 3
static не является частным, учитывая, что вы не можете прочитать статическую переменную даже в конструкторе класса (функция, которая входит в состав элементов структуры на языке C).
Вы можете использовать только статические переменные в той части кода, где они были определены (в функции, структуре,...).