Не являются ключевыми словами 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