c - 在 C 中使用块结构进行宏替换(K&R 问题 4.14)
问题描述
当尝试将块结构用作带有#define 语句的“替换文本”时,例如下面,
#define swap(t,x,y) { t _z; \
_z = x; \
x = y; \
y = _z; }
然后我尝试使用它:
printf( "%.2f %.2f\n", pow(a,b), pow( swap(int,a,b) ) );
但我收到以下编译器错误
414.c:14:21: error: expected expression before ‘{’ token
#define swap(t,x,y) { t _z; \
^
414.c:27:41: note: in expansion of macro ‘swap’
printf( "%.2f %.2f\n", pow(a,b), pow( swap(int,a,b) ) );
^~~~
不允许使用这样的块结构吗?如果我想使用宏的局部变量怎么办?
问题提示明确表示要使用块结构,而“C Answer Book”中有这段确切的代码作为解决方案。
解决方案
如果宏被展开
printf( "%.2f %.2f\n", pow(a,b), pow( swap(int,a,b) ) );
变成
printf( "%.2f %.2f\n", pow(a,b), pow( { int z; z=a; a=b; b=z} ) ) );
{ } 作为表达式无效。pow 也有两个参数。您可以将其重写为
printf( "%.2f", pow(a,b));
swap(int,a,b);
printf( "%.2f\n", pow(a,b));
推荐阅读
- java - 在 Oracle 数据库中上传 jar 时获取不同的 AES 加密值
- google-speech-to-text-api - error.runtime.java.lang.NoClassDefFoundError ,错误处理请求,java.lang.NoClassDefFoundError: com/google/cloud/speech/v1/SpeechClient
- javascript - azure函数将pdf转换为node.js中的图像?
- alsa - Liquidsoap 无法识别 alsa
- android - 如何在 Android 中使用无栏和全屏主题?
- html - 顶部 CSS 属性无法正常工作,而左侧工作正常
- javascript - 需要 ejs 文件中 app.js 中 html 标记的 ID
- python - 使用 sqlalchemy 将数据加载到 Oracle 数据库时,不允许使用“Multi”方法
- python - 按分组数据框上的前 n 个结果可视化列
- websocket - aiohttp websocket