'private'是C关键字吗?

时间:2009-03-08 07:28:09

标签: c private

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

3 个答案:

答案 0 :(得分:31)

private不是C89或C99关键字。见C Programming/Reference Tables on Wikibooks *。

此外,C与Java和C#没有任何关系(实际上,也不是C ++)。然而,反过来却不正确 - 例如,C ++从C增长。

*需要更好的参考!
**实际上,C89 "borrowed" the const and volatile keywords from C++。同样,C99“借用”了inline关键字,还添加了_Bool_Complex(分别与C ++的boolcomplex一样) [引用] -needed]

答案 1 :(得分:11)

也不是C关键字,但有些人会执行以下操作:

#define public 
#define private static

更新

对于那些认为做上述事情是个坏主意的人,我会同意。但它确实解释了为什么有人会认为publicprivate是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 ++标准的这一部分,它是未定义的行为:

  

包含a的翻译单元   标头不得包含任何宏   定义声明或定义的名称   在那个标题中。也不应该这样   翻译单元定义宏   名称与关键字词汇相同。

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

对于具有私有成员的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

答案 2 :(得分:0)

假设 静态不像私有,因为即使在构造函数中也无法读取静态变量class (用C语言编写结构成员的函数)。

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