编写预处理器功能:语法是否正确

时间:2013-02-11 04:23:15

标签: c++ c-preprocessor

我正在尝试类似预处理器函数的宏,所以我试图编写一个前向声明常规函数的宏。但是当我去编译时,它说第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, "", "");
}

3 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:3)

如果您尝试这样做,我建议使用-E的{​​{1}}标志(如果您正在使用gcc,MSVC或您正在使用的任何编译器都会有类似的东西)。这将在预处理器运行后打印出文件。

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

g++

答案 2 :(得分: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程序员来说更容易接受)。