2013-10-04 107 views
3

我想以輕鬆改變函數聲明使用宏函數聲明,這裏是我現在:宏不工作

#define MYDECLARATION(name) void name (void) 

當我打電話MYDECLARATION(my_thread);我得到一個錯誤:

identifier-list paramters may only be used in a function definition.

我試圖用##這樣的:

#define MYDECLARATION(name) void ##name (void) 

,但我敢肯定我會得到:voidmythread (void)在我的代碼。你有什麼想法如何做到這一點?

我也很感興趣,如果你知道關於一般宏的一些很好的教程。


迴應位掩碼評論:

我使用KEIL編譯然後我的線程正在如下:

#define MYDECLARATION(name) __task void name(void) 

我的電話:

MYDECLARATION(Mythread); 

我的定義:

__task void Mythread(void) 
{ 
    //... 
} 

新的測試:

#define RET_TEST  __task void 
#define PARAMETER void 

RET_TEST MYDECLARATION(PARAMETER); 

這是工作。所以我想這是使用宏參數到未工作的函數名的事實...

+0

你想輕鬆改變函數聲明的內容嗎?它的論據是什麼?它的返回類型?它的調用約定? ...? – Sneftel

+2

你在宏的末尾是否缺少分號?嘗試'#define MYDECLARATION(name)void name(void);' – SheetJS

+0

我的目標是在2個不同的體系結構之間獲得通用代碼。我的問題是線程聲明的語法。 – Joze

回答

1

以最好的方式瞭解預處理輸出是使用gcc的-E選項。

顯然,我複製了你的程序。

#define MYDECLARATION(name) void name (void) 

#include "stdio.h" 


void my_thread() 
{ 
    printf("hello world\r\n");  

} 


int main(int argc, char **argv) 
{ 

    MYDECLARATION(my_thread); 
    return 0; 
} 

現在, $ gcc的-E example.c

int main(int argc, char **argv) 
{ 

    void my_thread (void); 
    return 0; 
} 

你知道,你不能說這樣的功能。它應該被稱爲my_thread(); 我在宏中做了一個改變 - #define MYDECLARATION(name)name() 它工作正常。希望這可以幫助你。要回答你的第二個問題,我已經在預處理方面做了一筆 - http://www.tune2wizard.com/c-tokens/。萬一,它可以幫助你。