如何在宏里面用使用条件编译

sunyeshigou 2011-05-23 04:21:52
#define userprintf(X_) \
#if (defined(X_A) && defined(X_W)) \
fprintf(file, "!ifdef NSIS_UNICODE\n"); \
fprintf(file, "!define X_\t0x%08X\n", X_W); \
fprintf(file, "!else\n"); \
fprintf(file, "!define X_\t0x%08X\n", X_A); \
fprintf(file, "!endif\n"); \
#else \
fprintf(file, "!define X_\t0x%08X\n", X_); \
#endif

即如果一个常量有 ANSI 和 UNICODE 版本,如:
!ifdef NSIS_UNICODE
!define LVM_INSERTITEM 0x00001007
!else
!define LVM_INSERTITEM 0x0000104D
!endif
否则直接输出:
!define LVM_DELETEITEM 0x00001008

这是给 NSIS 里用的常量定义。但是由于 C++ 头文件比较繁琐,而且大部分被定义为 WM_USER + 十进制数字的方式,而我需要将其输出为 32 位的 16 进制数,所以搬运并不容易,工程量很大。想使用一个简单快捷的方法将值直接输入为 NSIS 头文件,但是没想到这种方式根本无法通过。
...全文
220 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyeshigou 2011-05-24
  • 打赏
  • 举报
回复
都没人回复,算了结贴了。使用正则批量替换得了。
sunyeshigou 2011-05-23
  • 打赏
  • 举报
回复
上面常量中的值 LVM_INSERTCOLUMN 又搞错了,但是目的就是那样。
sunyeshigou 2011-05-23
  • 打赏
  • 举报
回复
感谢楼上两位的关注。我目前要解决的问题是:

使用这样的代码写入文件:
int main(int argc, char* argv[])
{
file = fopen("defines.nsh", "w");
userprintf(LVM_INSERTCOLUMN);
userprintf(LVM_DELETECOLUMN);
userprintf(LVM_INSERTITEM);
userprintf(LVM_DELETEITEM);
fclose(file);
return 0;
}

文件中的内容最后要是这样:
!ifdef NSIS_UNICODE
!define LVM_INSERTCOLUMN 0x0000101B
!else
!define LVM_INSERTCOLUMN 0x00001061
!endif
!define LVM_DELETECOLUMN 0x0000101C
!ifdef NSIS_UNICODE
!define LVM_INSERTITEM 0x0000104D
!else
!define LVM_INSERTITEM 0x00001007
!endif
!define LVM_DELETEITEM 0x00001008
www_adintr_com 2011-05-23
  • 打赏
  • 举报
回复
#if defined(X_##A) && defined(X_##W)
#define userprintf(X_) \
fprintf(file, "!ifdef NSIS_UNICODE\n"); \
fprintf(file, "!define X_\t0x%08X\n", X_##W); \
fprintf(file, "!else\n"); \
fprintf(file, "!define X_\t0x%08X\n", X_##A); \
fprintf(file, "!endif\n");
#else
#define userprintf(X_) fprintf(file, "!define X_\t0x%08X\n", X_);
#endif
  • 打赏
  • 举报
回复
#define 里面不能有#if 之类的。
#if defined(X_##A) && defined(X_##W) 
#define userprintf(X_) \
fprintf(file, "!ifdef NSIS_UNICODE\n"); \
fprintf(file, "!define X_\t0x%08X\n", X_##W); \
fprintf(file, "!else\n"); \
fprintf(file, "!define X_\t0x%08X\n", X_##A); \
fprintf(file, "!endif\n");
#else
#define userprintf(X_) \
fprintf(file, "!define X_\t0x%08X\n", X_);
#endif
sunyeshigou 2011-05-23
  • 打赏
  • 举报
回复
#define userprintf(X_) \
#if defined(X_##A) && defined(X_##W) \
fprintf(file, "!ifdef NSIS_UNICODE\n"); \
fprintf(file, "!define X_\t0x%08X\n", X_##W); \
fprintf(file, "!else\n"); \
fprintf(file, "!define X_\t0x%08X\n", X_##A); \
fprintf(file, "!endif\n"); \
#else \
fprintf(file, "!define X_\t0x%08X\n", X_); \
#endif

修改后还是没有解决问题!
ouyh12345 2011-05-23
  • 打赏
  • 举报
回复
一般是
#ifdef ...
#define ...
#else
#define ...
#endif

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧