2016-02-15 34 views
2
#include<stdio.h> 

#define DEF6 625 
#define DEF6 625 
#define DEF(n) DEF##n 

void main(){ 
    printf("%d\n", DEF(6)); 
} 

此代碼有效。 但是如何在C預處理器中使用'##'添加Integer?

#include<stdio.h> 

#define DEF6 625 
#define DEF(n) DEF##n 

void main(){ 
    int a=6; 
    printf("%d\n", DEF(a)); 
} 

此代碼不起作用。 錯誤的結果是這樣的

Line 8: error: 'DEFa' undeclared (first use in this function)
Line 8: error: (Each undeclared identifier is reported only once
Line 8: error: for each function it appears in.)

所以,我怎麼能使用##添加整型變量#define

+1

'##'是一個連接運算符,不是加法! – Olaf

+1

你試圖解決的大問題是什麼? – Caleb

+0

@Caleb:優秀問題,OP:你爲什麼要實施這樣的解決方案? –

回答

6

宏在運行時不進行評估,因此您傳遞給宏的參數的字面意思是因爲「未對其進行評估」。你想做的事情很容易用數組來完成。當有一個簡單而簡單的解決方案時,不要試圖強制錯誤的方法。

由於a不評估,如果傳遞a然後a因此被

DEF(a) 

用於替換DEFa

做這樣的

#include <stdio.h> 

static const int DEF[] = {[6] = 625}; 

int 
main(void) 
{ 
    int a = 6; 
    printf("%d\n", DEF[a]); 
} 
+1

有趣,一個downvote!爲什麼,怎麼了? –

1

這不能做。

預處理器替換髮生在編譯代碼之前。變量a在這一點上沒有任何價值,它甚至不被認爲是變量或類型。

您必須使用整數常量或該常量的定義,如第一個示例中所示。