Est-ce que 'privé' est un mot clé C?
Question
Les mots clés "privés" ou "publics" sont-ils définis dans ANSI C (ou n'importe quel autre C), ou ont-ils été ajoutés uniquement en C ++ (et en Java, C #, ...)?
La solution
private
n'est pas un mot clé C89 ou C99. Voir Tables de programmation / références C sur Wikibooks *.
De plus, C n'a rien ** à voir avec Java et C # (et, en réalité, pas C ++ non plus). Cependant, l'inverse n'est pas vrai - C ++, par exemple, est passé de C.
* Meilleure référence nécessaire!
** En fait, C89 " emprunté " les mots clés const
et volatile
à partir de C ++ . De même, C99 "emprunté" le mot clé inline
, et également ajouté _Bool
et _Complex
(comme le bool
et le complexes de C ++> >, respectivement) [citation nécessaire] .
Autres conseils
Ce ne sont pas non plus des mots clés C, mais certaines personnes procèdent comme suit:
#define public
#define private static
Mise à jour:
Je suis d’accord pour ceux qui pensent que c’est une mauvaise idée de faire ce qui précède. Mais cela explique pourquoi quelqu'un pourrait penser que public
ou privé
sont des mots-clés en C.
Pour ceux qui pensent que la compilation en C ne sera pas compilée, essayez ceci:
#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");
}
Pour ceux qui pensent ne pas compiler en C ++, oui, le programme ci-dessus le fera.
Mise à jour:
En fait, il s'agit d'un comportement non défini en raison de cette partie de la norme C ++:
Une unité de traduction comprenant un l'en-tête ne doit contenir aucune macros qui définissent des noms déclarés ou définis dans cet en-tête. Ni un tel unité de traduction définir les macros pour noms lexicalement identiques aux mots clés.
Les exemples ci-dessus et ci-dessous ne sont donc pas tenus de faire une chose saine en C ++, ce qui est une bonne chose. Ma réponse est toujours valable pour C (jusqu’à preuve du contraire! :-)).
Dans le cas d'une classe C ++ avec des membres privés, vous pouvez faire quelque chose de similaire (considéré comme un abus) comme ceci:
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
statique ne ressemble pas à privé , étant donné que vous ne pouvez pas lire une variable statique, même dans le constructeur du de class (la fonction qui intègre les membres d'une structure en langage C).
Vous ne pouvez utiliser que des variables statiques dans la partie du code où elles ont été définies (dans une fonction, une structure, ...).