我相信我会得到20个人说"你为什么要这样做呢"......但是,我会问我的问题,因为它有点学术性质.
我想用C宏重新定义[ClassName new]为:new(ClassName),我想知道如何做到这一点.我开始时对C宏不太满意(我知道 - 令人尴尬 - 我应该这样) - 而且我绝对不喜欢将它们与我的Objective-C代码混合使用.那么,关于这个问题......
首先,作为预处理器,我可以做一个简单的替换:
#define new(x) [x new]
Run Code Online (Sandbox Code Playgroud)
或者,无论出于何种原因,我是否需要下载到objective-c运行时,并执行更类似于以下的操作:
#define new(x) objc_msgSend(class_createInstance(x, 0), sel_registerName("init"))
Run Code Online (Sandbox Code Playgroud)
做这样的事情有什么不足之处?
这种事情经常被其他人使用,或者,有人会看着它说"你在那里做什么"?(我应该关心)
谢谢
编辑:
事实上,在我发布之后发生了这件事,事实上我之前看到过这种事情 - 在Three20 lib中,他们做了这样的事情:
#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
#define TT_INVALIDATE_TIMER(__TIMER) { [__TIMER invalidate]; __TIMER = nil; }
// Release a CoreFoundation object safely.
#define TT_RELEASE_CF_SAFELY(__REF) { if (nil != (__REF)) { CFRelease(__REF); __REF = nil; } }
Run Code Online (Sandbox Code Playgroud)
所以我的问题可能很简单; 这样做有什么不足之处,这是一种相对公认的做法,还是会让我陷入更多困境的事情呢?
我知道最好避免使用c ++中的宏.使用内联函数替换类似函数的宏,并使用constexpr/using来替换const-variable-define宏.但我想知道是否有一种方法可以通过一些现代的c ++技术取代宏连接功能.
例如,如何替换以下宏:
#define GETTER_AND_SETTER(name) \
inline void Set##name(int value) \
{ \
m_##name = value; \
}
inline int Get##name() const \
{ \
return m_##name; \
}
Run Code Online (Sandbox Code Playgroud)
然后在一个类中,我可以为很多变量做这个,这使得代码更加干净.
GETTER_AND_SETTER(Variable1)
GETTER_AND_SETTER(Variable2)
GETTER_AND_SETTER(Variable3)
...
Run Code Online (Sandbox Code Playgroud)
我在这里和这里检查过,但我没有得到答案.伙计们,对此有任何想法吗?谢谢.
编辑:getter/setter的例子只是用来表示想法.请不要专注于他们.:)
我试着写一些简单的宏来简化设置和清除位的任务,这应该是一个简单的任务,但我似乎无法使它们正常工作.
#define SET_BIT(p,n) ((p) |= (1 << (n)))
#define CLR_BIT(p,n) ((p) &= (~(1) << (n)))
Run Code Online (Sandbox Code Playgroud) 我一直#include <minmax.h>在我的脚本中使用min()并按max()预期使用。我向某人展示了这个,他们以前从未见过它,说这对他们不起作用,并问我为什么不包括<algorithm>和调用std::min()or std::max()。
所以我的问题基本上是,为什么我不是?我在一本关于 C++ 的书中发现了这一点:“C++ 设计模式和衍生品定价”。谷歌搜索"minmax.h",我在最上面的结果中找到了对那本书的引用,所以更让我觉得这是不正常的。
谁能告诉我这是什么?
嗨,我有这本书带有一个我无法回答的练习题.不,这不是一个功课问题.这是我从一本推荐给我的书中的自学:"计算机系统,程序员的视角"
这是一个问题:

任何帮助表示赞赏!
考虑我设法编写的以下代码:
#include <stdio.h>
#define FOR(A, B, C) for(A; B; C++)
int main()
{
FOR(i=0, i<10, i)
printf("%i", i);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0123456789
如果我这样做,FOR(i=5, i<10, i)
那么输出分别是56789
我的问题是合法的吗?它会在不同的情况下导致任何错误吗?它是否像for循环一样工作?