是 ANSI C(或任何其他 C 语言)中的“私有”或“公共”关键字,还是仅在 C++(以及 Java、C#、...)中添加?
3 回答
private
不是 C89 或 C99 关键字。请参阅Wikibooks 上的 C 编程/参考表*。
此外,C 与 Java 和 C# 毫无关系**(实际上,也与 C++ 无关)。然而,反之则不然——例如,C++ 是从 C 发展而来的。
* 需要更好的参考!
** 实际上,C89 “借用”了C++ 的const
andvolatile
关键字。同样,C99“借用”了inline
关键字,还添加了_Bool
and _Complex
(分别像 C++bool
和complex
)[citation-needed]。
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
static不像private ,因为即使在类的构造函数(在 C 语言中初始化结构成员的函数)中也无法读取静态变量。
您只能在定义它们的代码部分(在函数、结构......)中使用静态变量。