Подтвердить что ты не робот

Является ли 'private' ключевым словом C?

Являются ли 'private' или 'public' ключевыми словами в ANSI C (или любой другой C, если на то пошло), или они были добавлены только в С++ (и Java, С#,...)?

4b9b3361

Ответ 1

private не является ключевым словом C89 или C99. См. C Программирование/Справочные таблицы в Викиучебниках *.

Кроме того, C не имеет ничего общего с Java и С# (и, действительно, не с С++). Однако обратное неверно: например, С++ вырос из C.

* Лучшая ссылка нужна!
** Фактически, C89 "заимствовал" ключевые слова const и volatile из С++. Аналогично, C99 "заимствовал" ключевое слово inline, а также добавил _Bool и _Complex (например, С++ bool и complex) [citation-needed].

Ответ 2

Ни ключевые слова 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");
}

Для тех, кто считает, что он не будет компилироваться в С++, да, указанная выше программа будет.

Обновление:

На самом деле это поведение undefined из-за этой части стандарта С++:

Блок перевода, который включает заголовок не должен содержать макросов которые определяют имена, объявленные или определенные в этом заголовке. И такой единицы перевода определяют макросы для имена, лексически идентичные ключевым словам.

Таким образом, пример выше и ниже не требуется делать что-то разумное на С++, что хорошо. Мой ответ по-прежнему полностью применим для 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

Ответ 3

static не является частным, учитывая, что вы не можете прочитать статическую переменную даже в конструкторе класса (функция, которая входит в состав элементов структуры на языке C).

Вы можете использовать только статические переменные в той части кода, где они были определены (в функции, структуре,...).