Domanda
Sono parole chiave "private" o "pubbliche" in ANSI C (o qualsiasi altra C del caso) o sono state aggiunte solo in C ++ (e Java, C #, ...)?
Soluzione
private
non è una parola chiave C89 o C99. Vedi Tabelle di programmazione / riferimento C su Wikibooks *.
Inoltre, C non ha nulla a che fare con Java e C # (e, in realtà, nemmeno con C ++). Tuttavia, il contrario non è vero, ad esempio C ++ è cresciuto da C.
* È necessario un riferimento migliore!
** In realtà, C89 " preso in prestito " le parole chiave const
e volatile
da C ++ . Allo stesso modo, C99 "preso in prestito" la parola chiave inline
e aggiunto anche _Bool
e _Complex
(come bool
e complex
, rispettivamente) [citation-need[.
Altri suggerimenti
Né sono parole chiave C, ma alcune persone fanno quanto segue:
#define public
#define private static
Aggiornamento:
Per coloro che pensano che sia una cattiva idea fare quanto sopra, sono d'accordo. Ma spiega perché qualcuno potrebbe pensare che public
o private
siano parole chiave C.
Per coloro che pensano che non si compili in C, prova questo:
#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");
}
Per coloro che pensano che non verrà compilato in C ++, sì, il programma sopra lo farà.
Aggiornamento:
Beh, in realtà è un comportamento indefinito a causa di questa parte dello standard C ++:
Un'unità di traduzione che include a l'intestazione non deve contenere macro che definiscono i nomi dichiarati o definiti in quell'intestazione. Né tale a le unità di traduzione definiscono le macro per nomi lessicamente identici alle parole chiave.
Quindi l'esempio sopra e sotto non è necessario per fare qualcosa di sano in C ++, il che è una buona cosa. La mia risposta è ancora completamente valida per C (fino a quando non si sarà dimostrato che è sbagliato! :-)).
Nel caso di una classe C ++ con membri privati, puoi fare qualcosa di simile (considerato un abuso) come questo:
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
statico non è come privato , dato che non puoi leggere una variabile statica nemmeno nel costruttore del class (la funzione che integra i membri di una struttura in linguaggio C).
Puoi usare solo variabili statiche nella parte del codice in cui sono state definite (in una funzione, una struttura, ...).