【问题标题】:macro equal to function?宏等于函数?
【发布时间】:2013-06-30 09:20:07
【问题描述】:

FAILED macro

Macro (computer science)

看完上面的文章,我还是不太确定宏是一个函数还是其他什么。宏等于函数吗?

例子:

    //  Create a Direct3D 9 device.
    hr = direct3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dPP, &d3dDevice);

    //  Cout out the message to indicate the failure.
    if(FAILED(hr))
       return 0;

【问题讨论】:

  • 我想如果我没记错的话,宏可能有也可能没有参数,但所有函数都有。并且宏不会将任何内容返回给调用者,而函数必须选择或不返回。
  • 我使用 cout
  • 是的,我的意思是,你也可以有std::cout<<__DO_SOMETHING__ <<std::endl;
  • @hagubear 你的两个定义都是完全错误的。函数和类似函数的宏都可以接受零个或多个参数。宏在技术上不会返回值,因为它们不是函数,但它们仍然可以产生值。

标签: c++ winapi direct3d directx-9 direct3d9


【解决方案1】:

在 C 和 C++ 中,宏是一种“用那个替换这个”类型机制,在很多意义上与函数完全不同。它有时可以用来替换函数,但你应该非常小心。用作函数的宏中一些著名的“失败”如下:

#define SQR(x) x * x

.... 

int x = 5;
int s = SQR(x+1);

这不会给出 36,而是 (x + 1 * x + 1),这在我的脑海中是 12 - 这不是你想要的。可以通过使用函数或在 SQR 宏中在 x 周围添加额外的括号来修复。

宏的另一种“聪明”用法:

#define IS_UPPER(c)  ((c) >= 'A' && (c) <= 'Z')

char *str = "Some String With a few Upper Case letters";
int uppers = 0;
while(*str) if (IS_UPPER(*str++)) uppers++;

现在,这会出错(在这种特殊情况下,如果我们避免由于“丢失”结束标记而导致崩溃并继续前进...),因为:

IS_UPPER(*str++)

翻译为:

(*str++) >= 'A' && (*str++) <= 'Z'

如果str 位于字符串“Some ...”的开头,则第一步为真,但第二步不为真,因为我们现在指向的是“o”不小于或等于“Z”。使用函数将在这里“按预期”工作。

【讨论】:

  • 好答案。使用宏时要非常小心!
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2023-03-26
相关资源
最近更新 更多