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, "", "");
}
4

3 回答 3

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)

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

于 2013-02-11T04:29:45.677 回答
3

如果您尝试这样做,我建议使用-E标志 for 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, "", "");
}
于 2013-02-11T04:30:06.713 回答
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 程序员接受)。

于 2013-02-11T04:30:03.027 回答