'private'或'public'关键字在ANSI C(或任何其他C语言)中是否存在,还是它们只是在C++(以及Java、C#等)中添加的?
private
并不是C89或C99的关键字。请参考Wikibooks上的C编程参考表*。
此外,C语言与Java和C#(以及实际上也不包括C++)没有任何关系。然而,反过来说并不正确——例如,C++是从C语言中发展而来。
* 需要更好的参考资料!
** 实际上,C89从C++“借”了const
和volatile
这两个关键字。同样地,C99“借”了inline
关键字,并且还添加了_Bool
和_Complex
(分别类似于C++中的bool
和complex
)[需要引用]。
尽管它们并不是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 ++类,您可以执行类似于以下内容(被视为滥用):
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
static 不像 private,因为即使在 class 的 constructor 中(C 语言中初始化结构体成员的函数),也无法读取静态变量。
你只能在定义它们的代码部分(在函数、结构体等中)使用静态变量。
//
行末注释的语法。 - chqrlie