18

是 ANSI C(或任何其他 C 语言)中的“私有”或“公共”关键字,还是仅在 C++(以及 Java、C#、...)中添加?

4

3 回答 3

30

private不是 C89 或 C99 关键字。请参阅Wikibooks 上的 C 编程/参考表*。

此外,C 与 Java 和 C# 毫无关系**(实际上,也与 C++ 无关)。然而,反之则不然——例如,C++ 是从 C 发展而来的。

* 需要更好的参考!
** 实际上,C89 “借用”了C++ 的constandvolatile关键字。同样,C99“借用”了inline关键字,还添加了_Booland _Complex(分别像 C++boolcomplex[citation-needed]

于 2009-03-08T07:29:47.847 回答
13

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");
}

对于那些认为它不会在 C++ 中编译的人,是的,上面的程序会。

更新:

实际上,由于 C++ 标准的这一部分,它是未定义的行为:

包含头文件的翻译单元不应包含定义在该头文件中声明或定义的名称的任何宏。这样的翻译单元也不应为在词法上与关键字相同的名称定义宏。

所以上面和下面的例子不需要在 C++ 中做任何理智的事情,这是一件好事。我的回答仍然对 C 完全有效(直到它被证明是错误的!:-))。

对于具有私有成员的 C++ 类,您可以执行类似的操作(被视为滥用),如下所示:

主.c

#include <cstdlib>
#define private public
#include "message.hpp"

int main() {
    Message msg;

    msg.available_method();
    msg.hidden_method();

    return (EXIT_SUCCESS);
}

消息.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
于 2009-03-08T07:31:05.517 回答
0

static不像private ,因为即使在类的构造函数(在 C 语言中初始化结构成员的函数)中也无法读取静态变量。

您只能在定义它们的代码部分(在函数、结构......)中使用静态变量。

于 2012-05-07T21:01:47.763 回答