2017-09-17 119 views
-1

我正在閱讀另一篇文章,但我無法讓我的程序工作。我需要用一個新的常量使用C預處理器定義的兩個常量。這是我的代碼:C預處理器操作員##

#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; 
} 

但是,當我想顯示我的新常數,它不起作用。 有人能幫助我嗎?

+3

你想做什麼?作爲輸出你期望什麼?你不能用一個數字開始一個標識符;您通常使用'##'運算符使用宏參數。 –

+0

嗨。我正在嘗試創建一個字符串,它將成爲文件文本的名稱。它將包含兩部分。一個DIM(5000,6000,7000等)和ARCHIVOMATRIZ文件的名稱。我想要使​​文件的名稱如:5000matrizDiagonalDominante.txt,6000MatrizDiagonalDominante等 – Patricio

+0

請將該信息添加到問題中,您可以在其中格式化該問題。我還建議從你的問題中刪除註釋掉的代碼;這裏沒有任何用處。 –

回答

1

鑑於comment

我試圖做一個字符串,這將是一個文本文件的名稱。它將包含兩部分:​​(5000,6000,7000等)的數字和ARCHIVOMATRIZ的文件名稱。我想做出這樣的文件名:5000matrizDiagonalDominante.txt6000MatrizDiagonalDominante.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; 
} 

輸出:

Archivo destino: 5000matrizDiagonalDominante.txt 

如果你想要的名稱各部分之間的下劃線,然後用:

#define NAME_FROM_MACROS(x, y) STRINGIZE(x) "_" y 

等等

+0

感謝@Jonathan Lefftler爲你而努力。 – Patricio