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 #, ...)?

Était-ce utile?

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, ...).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top