2013-12-17 39 views
0

我知道你可以從一個正常的功能Ç在這個代碼返回一個字符串從返回的#define功能的字符字符串

#include <stdio.h> 

char* returnstring(char *pointer) { 
    pointer="dog"; 
    return pointer; 
} 

int main(void) 
{ 
    char *dog = NULL; 
    printf("%s\n", returnstring(dog)); 
} 

不過,我不能找到一種方法,能夠返回字符串中#define功能,在此代碼

#include <stdio.h> 

#define returnstring(pointer) { \ 
    pointer="dog"; \ 
    return pointer; \ 
} 

int main(void) 
{ 
    char *dog = NULL; 
    printf("%s\n", returnstring(dog)); 
} 

我知道有解決方法(如使用的第一個程序)。我只想知道它是否可能

+1

簡短的回答:不能。不要混淆,類似宏函數不會像函數那樣表現。 –

回答

0

您不會從#define d宏返回任何東西。粗略地說,C預處理器將宏調用替換爲宏體的文本,並將參數文本地替換爲它們的位置。如果你想有一個宏觀的指針分配給"dog"和評估指針,你可以這樣做:

#define dogpointer(p) ((p)="dog") 
1

關於「#定義功能」思考是,海事組織,錯誤的方式來處理這一點。

#define是一個鈍器,它相當於一個文本查找/替換。它對C++作爲一種語言一無所知,並且在你真正的代碼甚至被查看之前完成替換。

你寫的東西本身並不是一個函數,它是一段看起來像一個文本的文本,它放在你寫下別名的地方。

如果你想#define你剛剛做了什麼,那很好(我沒有特別檢查你的例子,但是一般情況下,使用#define作爲函數調用並替換參數是可能的)這樣做除非你有一個驚人的理由。然後再想一想,直到你決定不這樣做。

1

您不能從宏返回。你最好的(呃......可以說是「最好的」,但無論如何)打賭是以這樣一種方式來表達你的宏,以便評估你想成爲結果的表達。例如:

#define returnstring(ptr) ((ptr) = "hello world") 

const char *p; 
printf("%s\n", returnstring(p)); 

如果您有多個表達式語句,你可以使用可怕的逗號操作符分隔它們:

#define even_more_dangerous(ptr) (foo(), bar(), (ptr) = "hello world") 

如果使用GCC或兼容的編譯器,你也可以利用GNU擴展名爲「語句表達」以便嵌入整體(不表達)語句到您的宏:

#define this_should_be_a_function(ptr) ({ \ 
    if (foo) { \ 
     bar(); \ 
    } else { \ 
     for (int i = 0; i < baz(); i++) { \ 
      quirk(); \ 
     } \ 
    } \ 
    ptr[0]; // last statement must be an expression statement \ 
}) 

但是如果你至此,你可以真正寫出一個合適的功能。

0

事情是returnstring作爲一個宏沒有做它說什麼;它也爲參數賦值。這個函數就像它說的那樣,即使它(有點奇怪)使用它的參數作爲一個臨時變量。

的功能等同於:

char* returnstring(char *ignored) { 
    return "dog"; 
} 

功能宏是一樣一樣的:

#define returnstring(pointer) pointer = "dog" 

這引出了一個問題,爲什麼不把它assign_string

或者爲什麼不只是有:

#define dogString "dog" 

而寫:

int main(void) 
{ 
    char *dog = NULL; 
    printf("%s\n", dog = dogString); 
} 

爲assignString功能是:

char* assignstring(char **target{ 
    *target= "dog"; 
    return *target; 
} 

然後,您可以有一個宏:

assign_string_macro(pointer) assignstring(&pointer) 

最後,如果你想「在的#define功能返回字符串」,那麼所有你需要的是:

#define returnstring(ignored) "dog"