在 C 语言中使用 this 关键字是否明智?

Is it wise to use the `this` keyword in C?

基本上,我在 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 而不是适应(在我看来很丑)sizeof(struct array);.

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

技术上是正确的,因为 C 不是 C++,所以 this 不是 C 中的关键字。

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

是的,你可以。如果代码碰巧被编译为 C++,那不是你的错。但是,如果发生这种情况,其他的东西将不会被接受;例如,您可能会在没有强制转换的情况下分配给 items,因为 C++ 不允许这样做,这与 C 不同。

不在标准 C 中使用 this 的原因是它使您的代码:

  1. 由于在 C++ 中 this 的 "well-known" 使用,可读性稍差。您的代码看起来好像是 C++,不知情的人 reader 很容易混淆。
  2. 无法移植到 C++。如果您(或其他人)想要获取此代码并在 C++ 编译中使用它,它将失败。这同时是一个缺点和一个优点,因为出现错误可能表明必须小心,如果没有出现错误可能会让重要问题溜走。

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

顺便问一下,这些适用于任何 C++ 保留字(如 classfinal 等)的方式是:

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

因为 this 是可以避免的,我发现使用它是不道德的,但并非不正确。

我并不是说您必须在编写 C 语言之前先学习 C++,但是一旦您了解了一些东西,就可以很好地利用它。

您可能会导致的一个微妙问题是使您的代码 'uncallable' 来自 C++,例如

#define this some_definition

在后来从 C++ 中包含的 C 头文件中可能会对您的代码产生奇怪的影响。

正如已经提到的,您可以使用任何非保留关键字作为变量名。 但是,我建议使用 'pThis' 或 '[struct name]This' 或类似的东西来表达您使用 C struct 以及将指向 [struct name] 实例的指针作为第一个参数的函数的意图, 并且旨在以与 C++ class 的成员函数类似的方式使用。

这样您的代码可能更易读,您的意图可能更容易被使用它的人理解。

这取决于你的 objective 是什么。

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

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

最后你需要决定你愿意在未来维护你的代码时承担什么样的风险。

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