在 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
的原因是它使您的代码:
- 由于在 C++ 中
this
的 "well-known" 使用,可读性稍差。您的代码看起来好像是 C++,不知情的人 reader 很容易混淆。
- 无法移植到 C++。如果您(或其他人)想要获取此代码并在 C++ 编译中使用它,它将失败。这同时是一个缺点和一个优点,因为出现错误可能表明必须小心,如果没有出现错误可能会让重要问题溜走。
以任何方式使用 this
是完全有效的 C。
顺便问一下,这些适用于任何 C++ 保留字(如 class
、final
等)的方式是:
- 我是否使用突出显示
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 的此类关键字或标识符可能是一种有价值的方法。
基本上,我在 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
的原因是它使您的代码:
- 由于在 C++ 中
this
的 "well-known" 使用,可读性稍差。您的代码看起来好像是 C++,不知情的人 reader 很容易混淆。 - 无法移植到 C++。如果您(或其他人)想要获取此代码并在 C++ 编译中使用它,它将失败。这同时是一个缺点和一个优点,因为出现错误可能表明必须小心,如果没有出现错误可能会让重要问题溜走。
以任何方式使用 this
是完全有效的 C。
顺便问一下,这些适用于任何 C++ 保留字(如 class
、final
等)的方式是:
- 我是否使用突出显示
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 的此类关键字或标识符可能是一种有价值的方法。