在C中使用`this`关键字是明智的吗?

时间:2015-07-19 11:05:23

标签: c class this c99

基本上,我在C中有一个内联函数:

struct array {
    unsigned long size;
    void* items;
};
typedef struct array* Array;
inline Array array_create(unsigned long initsize);
inline void  array_free(Array this);

我是否可以在这种情况下自由使用this关键字,或者更好地避免它,为什么(不是)?

编辑:此问题源于我的代码中的一个错误,我使用了inline void array_free(Array array);更改了sizeof(array);的结果,并让我想到使用this而不是适应({1}}在我看来很丑陋)sizeof(struct array);

7 个答案:

答案 0 :(得分:8)

技术上正确,因为C不是C ++,因此uuid不是C中的关键字。

是否明智,现在这是一个不同的问题。如果这段代码有可能被编译为C ++,那么名为this的标识符将破坏代码。

答案 1 :(得分:6)

以任何方式使用this都是完全有效的C.

您必须问自己,这些适用于classfinal等任何C ++保留字的方式是:

  • 我是否使用突出显示this作为关键字传递错误信息的程序?例如即使您在this文件中,Visual Studio也会突出显示.c,因此可能会出现混淆。
  • 我计划将来将代码推广到C ++吗?在这种情况下,你可以做一些额外的工作,这是可以避免的。
  • 我的代码是否与C ++交互?这本身不是问题,但您必须记住,您的代码也将与C ++程序员交互。并且你不会把那些可能不太了解C的人混淆得非常详细(尽管有人可能会说他们的职责是在他们阅读另一种语言时知道他们在做什么)。

由于this是可以避免的,我觉得使用它不道德但不正确。

我不是说你必须在编写C之前学习C ++,但是一旦你知道了什么,那么充分利用它是一种很好的做法。

您可能导致的一个微妙问题是使您的代码从C ++中“不可调用”,例如

#define this some_definition
后来从C ++中包含的C头文件中的

可能会对您的代码产生奇怪的影响。

答案 2 :(得分:5)

在标准C中不使用import tkinter x = tkinter.tkSimpleDialog.askstring 的原因是它使您的代码成为:

  1. 稍微不那么可读,因为"众所周知的"在C ++中使用this。您的代码看起来好像是C ++,而不知情的读者很容易混淆。
  2. 不支持C ++。如果您(或其他人)想要使用此代码并在C ++编译中使用它,它将失败。这是一个缺点,同时也是一个好处,因为得到一个错误可能表明必须小心谨慎,没有人可能会让重要问题失效。

答案 3 :(得分:1)

如前所述,您可以使用任何非保留关键字作为变量名称。 但是,我建议使用类似'pThis'或'[struct name] This'或类似的东西来表达你使用C结构的意图以及作为第一个参数的函数作为[struct name]实例的指针,以及意图以与C ++类的成员函数类似的方式使用。

通过这种方式,您的代码可能更具可读性,并且使用它的人更容易理解您的意图。

答案 4 :(得分:1)

这取决于你的目标。

如果你的C代码程序总是使用不是C ++编译器的C编译器构建,那么在代码中使用this作为标识符没有区别。它不是保留的标识符,因此您可以自由使用它。

这个前提的潜在问题是,许多主流C编译器实际上是C ++编译器,或者它们支持某些C ++功能作为扩展,因此他们可能会拒绝您的代码(或者 - 不太可能 - 用它做一些你不喜欢的代码不要期待。无法绝对肯定地预测所选择的编译器的供应商永远不会(即使他们给你一个书面承诺)发布他们的C编译器的未来版本,它会拒绝或做一些意想不到的事情。码。发生这种情况的可能性相对较低,但非零。

最后,您需要确定将来维护代码时您愿意承担的风险。

当然,如果你是C狂热者,他希望你的代码与C ++不兼容(是的,这样的人确实存在),那么使用一些特定于C ++的关键字或保留标识符,以及使用这些特定于(更新版本的)C的关键字或标识符可能是一种有价值的方法。

答案 5 :(得分:0)

在C中,您没有this关键字。仅在C ++和类中,因此您的代码是C,并且您使用this变量作为本地方法参数,您可以在其中访问数组结构。

答案 6 :(得分:0)

是的,你可以。如果代码恰好被编译为C ++,那不是你的错。但是,如果发生这种情况,其他事情将不被接受;例如,你可能在没有强制转换的情况下分配给items这一事实,因为C ++不允许这样做,而不像C语言。