2013-02-11 24 views
1

我正在试用预处理器函数式的宏,所以我正在尝试编写一个前向声明常规函数的宏。但是当我去编译它说第2行有不正确的语法。编写预处理器函数:语法是否正确

我在做什么错?

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) "int" #fName "(int id, string msg, string cmd);" 
FORWARD_DECLARE_CUSTOM_FUNCT("abc") // LINE 2: Should become "int abc(int id, string msg, string cmd);" 

void test() 
{ 
    abc(1, "", ""); 
} 
+0

它为什么要成为' “INT ......”'和'不INT ...'? – chris 2013-02-11 04:24:20

+0

@chris好的,我删除了所有的引号,但我仍然得到编译错误:'#define FORWARD_DECLARE_CUSTOM_FUNCT(fName)int #fName(int id,string msg,string cmd);' – 2013-02-11 04:26:40

回答

3

问题是所有的引号。

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) "int" #fName "(int id, string msg, string cmd);" 

转化为(串联字符串文字后):

"int abc (int id, string msg, string cmd);" 

然而,

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) int #fName (int id, string msg, string cmd); 

翻译为:

int "abc" (int id, string msg, string cmd); 

你真正需要的仅仅是:

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) int fName (int id, string msg, string cmd); 

使用方法如下:

FORWARD_DECLARE_CUSTOM_FUNCT(abc) 

这一切都只是文本替换。我个人会删除宏中的分号,并让用户在每次使用后都放入一个分号,使其更像是一个声明。我觉得这很自然。

2

你需要远离串化。你不用名字的字符串来编写函数;你不用这种表示法在预处理器中编写这样的函数。

看从预处理器的输出:

g++ -E yourfile.cpp 

或其等价物。我从你的两行中得到的输出是:

"int" "\"abc\"" "(int id, string msg, string cmd);" 

而且看起来不像函数声明;它是一个包含类似于函数声明的东西的字符串(但嵌套的双引号也会混淆)。

清理一点:

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) int fName(int id, string msg, string cmd) 
FORWARD_DECLARE_CUSTOM_FUNCT(abc); 

注意从宏定义到宏调用分号的转移;这对于一个经验丰富的C++程序员来说看起来更好(尽管任何宏对于C++程序员来说都是一种诅咒;他们对C程序员更容易接受)。

3

如果你正在尝试这样做,我建议使用-E标志作为g++(如果你使用gcc,MSVC或者你使用的任何编译器都会有类似的东西)。这将在预处理器运行完毕后打印出文件。

无论如何,你要寻找的是这样的:

//No # 
#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) void fName(int id, string msg, string cmd); 

FORWARD_DECLARE_CUSTOM_FUNCT(abc) //No "" 

void test() 
{ 
    abc(1, "", ""); 
}