如何在C ++中使用PHP中的参数定义宏?

时间:2011-01-03 20:23:04

标签: php c-preprocessor

目标是:

#define sum( f1, f2 ) ( f1 + f2 )

,其中

sum(2,2)

在PHP中是4。这有可能吗?如果我可以打电话,那就更好了:

$s = 'first';
APPEND ' and second';

当append被定义为函数/方法/其他附加到$s的东西,所以在这两行之后$s将是'第一和第二'。

4 个答案:

答案 0 :(得分:3)

C中的宏点是它们在编译时被扩展。

因此,使用宏不会对代码的速度产生影响,而函数也会这样做。

因此,使用的一个例子是:

#define MYPRINTF(x) printf("MYPRINTF says : %s\n",x)
MYPRINTF("blah");

上面的代码将由编译器直接翻译成:

printf("MYPRINTF says : %s\n","blah");

它的全部意义在于它比定义一个函数更快,例如:

void myprintf(char *x)
{
  printf("myprintf says : %s\n","blah");
}

因为没有开销(在函数中,你需要将参数推送到堆栈等)。

在PHP这样的解释语言中,由于所有内容都是在运行时直接执行的,所以上面的内容并不成立,因此使用像C #define这样的机制绝对没用 - 因此,回答你的问题问题,只需使用普通功能。

答案 1 :(得分:2)

只是想一想你的意见

function withVeryLongWroteByAnIdiot() {
   ....
}

function xFunc() {
   return withVeryLongWroteByAnIdiot();
}

答案 2 :(得分:1)

PHP在这个意义上不支持宏,这个(非常有效)的参数我认为这与PHP中的普通函数没有太大区别。

毕竟,在运行时解释语言中使用这样的概念并不是没有任何价值。

答案 3 :(得分:0)

我不相信PHP支持宏。如果你考虑一下,C中的宏不是花哨的常量,而是常量是世界上最无聊的C宏。 PHP只能通过define function了解枯燥的形式。

尽管如此,我不同意其他受访者的有效性。它们有一个合理的原因:当你想使用内置函数来预处理某些东西时。例如:

macro default_if_empty_value(value, default) (empty(value) ? default : value)

如果您尝试将其作为函数编写并调用它:

default_if_empty_value($this->that['something']->or[$other], 'Not here.');

然后,如果未定义该变量链的任何部分,您将收到PHP警告,并且扩展版本更难以阅读:

empty($this->that['something']->or[$other]) ? 'Not here.' : $this->that['something']->or[$other];

PHP代码编译,但它是在运行时编译的。像这样的宏将由PHP解释器扩展,然后编译成PHP字节码。这个字节码通常由PHP解释器或像APC这样的附件缓存。

相关问题