基本上,我在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);
。
答案 0 :(得分:8)
技术上正确,因为C不是C ++,因此uuid
不是C中的关键字。
是否明智,现在这是一个不同的问题。如果这段代码有可能被编译为C ++,那么名为this
的标识符将破坏代码。
答案 1 :(得分:6)
以任何方式使用this
都是完全有效的C.
您必须问自己,这些适用于class
,final
等任何C ++保留字的方式是:
this
作为关键字传递错误信息的程序?例如即使您在this
文件中,Visual Studio也会突出显示.c
,因此可能会出现混淆。由于this
是可以避免的,我觉得使用它不道德但不正确。
我不是说你必须在编写C之前学习C ++,但是一旦你知道了什么,那么充分利用它是一种很好的做法。
您可能导致的一个微妙问题是使您的代码从C ++中“不可调用”,例如
#define this some_definition
后来从C ++中包含的C头文件中的可能会对您的代码产生奇怪的影响。
答案 2 :(得分:5)
在标准C中不使用import tkinter
x = tkinter.tkSimpleDialog.askstring
的原因是它使您的代码成为:
this
。您的代码看起来好像是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语言。