C预处理器操作符##
我正在读另一篇文章,但我的程序无法运行。我需要在一个新常量中使用C预处理器定义的两个常量。这是我的代码:C预处理器操作符##,c,c-preprocessor,C,C Preprocessor,我正在读另一篇文章,但我的程序无法运行。我需要在一个新常量中使用C预处理器定义的两个常量。这是我的代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #define DIM 5000 #define ARCHIVOMATRIZ "matrizDiagonalDominante.txt" #define ARCHIVODESTINO DIM ##_## ARCHIVOMATRIZ in
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 5000
#define ARCHIVOMATRIZ "matrizDiagonalDominante.txt"
#define ARCHIVODESTINO DIM ##_## ARCHIVOMATRIZ
int main(){
printf("Iniciando ejecucion del programa.\n");
printf("%s\n", ARCHIVODESTINO);
printf("Listo\n");
return 0;
}
#包括
#包括
#包括
#定义尺寸5000
#定义ARCHIVOMATRIZ“MatrizDiagonalDominant.txt”
#定义ARCHIVODESTINO DIM#######ARCHIVOMATRIZ
int main(){
printf(“Iniciando ejeucion del programa.\n”);
printf(“%s\n”,ARCHIVODESTINO);
printf(“Listo\n”);
返回0;
}
但是当我想显示我的新常数时,它不起作用。
有人能帮我吗?鉴于:
我正在尝试创建一个字符串,该字符串将作为文件文本的名称。它将由两部分组成:编号取自DIM
(5000、6000、7000等)和文件名取自ARCHIVOMATRIZ
。我想将文件名设置为:5000matrizdiagonaldominate.txt
,6000matrizdiagonaldominate.txt
,等等
要使用的正确运算符是“字符串化”运算符
,而不是令牌连接运算符
我想这正是你想要的:
#define DIM 5000
#define ARCHIVOMATRIZ "matrizDiagonalDominante.txt"
#define STRINGIZE(x) #x
#define NAME_FROM_MACROS(x, y) STRINGIZE(x) y
#define ARCHIVODESTINO NAME_FROM_MACROS(DIM, ARCHIVOMATRIZ)
它依赖于“字符串连接”。当两个字符串文字彼此相邻且只有(可选)空格分隔时,编译器将它们合并为单个字符串文字
测试代码:
#include <stdio.h>
#define DIM 5000
#define ARCHIVOMATRIZ "matrizDiagonalDominante.txt"
#define STRINGIZE(x) #x
#define NAME_FROM_MACROS(x, y) STRINGIZE(x) y
#define ARCHIVODESTINO NAME_FROM_MACROS(DIM, ARCHIVOMATRIZ)
int main(void)
{
printf("Archivo destino: %s\n", ARCHIVODESTINO);
return 0;
}
如果要在名称各部分之间加下划线,请使用:
#define NAME_FROM_MACROS(x, y) STRINGIZE(x) "_" y
等等。你想做什么?您期望的输出是什么?不能以数字开始标识符;通常将宏参数与
##
操作符一起使用。我正在尝试创建一个字符串,该字符串将作为文件文本的名称。它将由两部分组成。一个数字取自DIM(500060007000等),另一个文件名取自ARCHIVOMATRIZ。我想把文件名改为:5000MatrizDiagonalDominate.txt、6000MatrizDiagonalDominate等。请将这些信息添加到问题中,您可以在其中设置格式。我还建议从您的问题中删除注释掉的代码;这里没有用。谢谢@Jonathan Lefftler的提问。
#define NAME_FROM_MACROS(x, y) STRINGIZE(x) "_" y