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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top