我正在尝试类似预处理器函数的宏,所以我试图编写一个前向声明常规函数的宏。但是当我去编译时,它说第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 :(得分: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程序员来说更容易接受)。