c预处理器字符串连接

如何组合预定义的C值以生成字符串.

#define APP_NUMBER 22
#define ICON_FILE  "../icons/"##APP_NUMBER##".ico"

所以在我的.rc文件中我可以执行以下操作

 1000 ICON  ICON_FILE

代替
     1000 ICON“../icons/22.ico”

it didnt work

  #define MY_ICON_FILE 25
  #define STR(x) #x
  #define ICON_FILE_NUM(x) "../icons/" STR(x) ".ico"
  1000 ICON  ICON_FILE_NUM(MY_ICON_FILE)

编译器错误

  can't open icon file `../icons/': Permission denied

  nothing was appended to "../icons/"

我刚刚得到的最接近的是这样做:

  #define MY_ICON_FILE 25
  #define STR(x) #x
  #define ICON_FILE_NUM(x) "../icons/"STR(x)".ico" /// took out spaces
  1000 ICON  ICON_FILE_NUM(MY_ICON_FILE)

(取出STR(x)周围的空格)

并得到此编译器错误

 can't open icon file `../icons/"25".ico': Invalid argument

最佳答案 这有效:

#define APP_NUMBER 22
#define STR(x) #x
#define ICON_FILE_NAME(num)  "../icons/" STR(num) ".ico"
#define ICON_FILE ICON_FILE_NAME(APP_NUMBER)

#include <stdio.h>
int main(void) {
    printf("ICON_FILE = \"%s\"\n", ICON_FILE);
    return 0;
}

输出是:

ICON_FILE = "../icons/22.ico"

但ICON_FILE宏扩展为“../icons/”“22”“.ico”,这是C的有效语法(相邻的字符串文字被连接),但可能不适用于.rc文件,这解释了“可以” t打开图标文件“你收到的消息.

看起来您正在尝试使用令牌粘贴来生成字符串文字.问题在于,包含不匹配的“字符的部分字符串文字不能是有效的预处理标记.例如,您不能将单个”作为参数传递给宏.

考虑编写一个程序(脚本,无论如何),为您生成适当的#define指令.

点赞