“private”是C语言的关键字吗?

18

'private'或'public'关键字在ANSI C(或任何其他C语言)中是否存在,还是它们只是在C++(以及Java、C#等)中添加的?

3个回答

30

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

此外,C语言与Java和C#(以及实际上也不包括C++)没有任何关系。然而,反过来说并不正确——例如,C++是从C语言中发展而来。

* 需要更好的参考资料!
** 实际上,C89从C++“借”了constvolatile这两个关键字。同样地,C99“借”了inline关键字,并且还添加了_Bool_Complex(分别类似于C++中的boolcomplex[需要引用]


3
它们是 C 语言的进化版本,它们的语法大部分来自于 C。 - ripper234
C++没有虚数。但是你可以用“const”作为另一个例子,证明C从C++中汲取了灵感(来源:http://www.lysator.liu.se/c/rat/c5.html#3-5-3)。另一个例子是函数原型(#3-5-4)。 - Johannes Schaub - litb
@litb,我不记得C99之前的黑暗时代了。我会用你的信息更新我的答案。(对于关于虚数的错误信息感到抱歉!) - strager
@JohannesSchaub-litb:C99 添加了“_Imaginary”关键字,但不要求支持虚数。 - Keith Thompson
C++ 也向 C 借用了 // 行末注释的语法。 - chqrlie

13

尽管它们并不是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++标准的这一部分内容,它是未定义的行为:

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

因此,上述和下述示例在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

4
我并没有说我支持这个...有些人甚至会把头伸进烤箱里...但你可能会看到一些代码已经这样做了。 - TofuBeer
但,你确定吗?我认为这可能会有效,但是如果您包含标准头文件,则会出现未定义行为(UB)。因此,它可能没有那么有用 :) - Johannes Schaub - litb
2
@litb,通常的C++代码中不会编译成功,因为“private:”会被转换成“:”,从而导致语法错误。@Dan,C/C ++不是一种语言。在C中可以编译通过,除非您包含了某些C ++头文件(在这种情况下,应该有保护措施或用户疯了)。 - strager
我相信@TofuBeer指的是像这样的代码:public void printHelloWorld(); private int messWithGlobals_EVIL(bool areYouSerious); - strager
@Dan 我不明白你的意思...你是在说我的代码有什么问题吗(顺便说一下,这不是我的代码,但我以前见过它被使用)。 - TofuBeer
显示剩余4条评论

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接