![]() |
1
50
使用令牌粘贴时需要注意一件事:
如果不这样做,并且传递给令牌粘贴操作符的项本身就是宏,那么您将得到可能不是您想要的结果:
输出:
|
![]() |
2
47
在这里,他们希望使用两个字节的字符串,而不是每个字符字符串使用一个字节。这看起来似乎真的毫无意义,但他们这么做有很好的理由。
他们将其与另一个宏一起使用,该宏返回带有日期和时间的字符串。
放
Windows:对通用Unicode或多字节字符串使用## Windows使用类似以下内容:
各种库,用于清除访问器和修改器名称: 我还看到它在代码中用于定义访问器和修饰符:
同样,您也可以将此方法用于任何其他类型的智能名称创建。
|
![]() |
3
14
下面是我升级到新版本编译器时遇到的一个问题:
不必要地使用令牌粘贴操作符(
例如,可以尝试在编译时使用标记粘贴运算符构建字符串文字:
在某些编译器上,这将输出预期结果:
在其他编译器上,这将包括不需要的空白:
相当现代的GCC版本(>=3.3左右)将无法编译以下代码:
解决方案是在将预处理器令牌连接到C/C++运算符时忽略令牌粘贴运算符:
GCC CPP documentation chapter on concatenation 包含有关令牌粘贴运算符的更多有用信息。 |
![]() |
4
6
这在各种情况下都很有用,以避免不必要的重复。下面是来自Emacs源代码的示例。我们想从库中加载一些函数。函数“foo”应分配给
然后我们可以使用它:
好处是不必同时编写这两个文档
|
![]() |
5
4
关于StackOverflow的前一个问题要求使用一种平滑的方法为枚举常量生成字符串表示,而不需要大量容易出错的重新键入。
字符串表的名称来自使用##运算符将宏参数(即颜色)粘贴到StringTable。像这样的应用程序(技巧?)是#和##运算符非常宝贵的地方。 |
![]() |
6
3
当需要将宏参数与其他参数连接在一起时,可以使用标记粘贴。 它可用于模板:
|
![]() |
7
2
我在C程序中使用它来帮助正确地执行一组方法的原型,这些方法必须符合某种调用约定。在某种程度上,这可以用于穷人在直线C中的对象定向:
扩展到如下内容:
当您执行以下操作时,这将对所有“派生”对象强制执行正确的参数化:
|
![]() |
9
2
|
![]() |
10
1
我使用它为宏定义的变量添加自定义前缀。比如:
扩展到:
|
![]() |
11
1
主要用途是当您有命名约定并且希望宏利用该命名约定时。也许您有几个方法系列:image\u create()、image\u activate()和image\u release()以及file\u create()、file\u activate()、file\u release()和mobile\u create()、mobile\u activate()和mobile\u release()。
当然,一种“对象的最小版本”并不是唯一适用的命名约定——几乎绝大多数命名约定都使用公共子字符串来形成名称。它可以告诉我函数名(如上所述),或者字段名、变量名,或者其他任何东西。 |
![]() |
12
1
WinCE的一个重要用途是:
|
![]() |
13
0
它对于日志记录非常有用。你可以做:
或者,如果编译器不支持 作用 :
我的C++语法可能不太正确。 |
![]() |
jxh · 第一列需要#的编译器? 7 年前 |
![]() |
Pruzo · K&R 5.11函数指针C中的混淆线 8 年前 |
![]() |
Bar K · c程序的意外行为,试图从K&R解决E6-2 9 年前 |
![]() |
maja · K&R 1.6数组//数组构造中的数字表示 10 年前 |