Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误:在‘;之前应为主表达式;如果’;_C++_Macros_Libxml2 - Fatal编程技术网

C++ 错误:在‘;之前应为主表达式;如果’;

C++ 错误:在‘;之前应为主表达式;如果’;,c++,macros,libxml2,C++,Macros,Libxml2,这是我的代码,我不知道“if”附近哪里错了,c中的“primary expression”是什么 xml_parser.h #define xpath(smth, exp) if (sizeof(*smth) == sizeof(xmlNode)) { xpath_node((xml_node_ptr)smth, exp); } else{ xpath_doc((xml_doc_ptr)smth, exp); } xml_node_ptr *xpath_node(xml_node_ptr n,

这是我的代码,我不知道“if”附近哪里错了,c中的“primary expression”是什么

xml_parser.h

#define xpath(smth, exp) if (sizeof(*smth) == sizeof(xmlNode)) { xpath_node((xml_node_ptr)smth, exp); } else{ xpath_doc((xml_doc_ptr)smth, exp); }

xml_node_ptr *xpath_node(xml_node_ptr n, str exp);

xml_node_ptr *xpath_doc(xml_doc_ptr n, str exp);
xml_parser_test.cpp

TEST_F(XmlParserTest, xpath2) {
    xml_node_ptr n = xpath(d, "/html/body");
    xpath(n, "/div");
}
以下是我的输出:

/home/roroco/Dropbox/rbs/ro_sites/c/xml_parser_test.cpp: In member function ‘virtual void XmlParserTest_xpath2_Test::TestBody()’:
/home/roroco/Dropbox/rbs/ro_sites/c/xml_parser.h:17:26: error: expected primary-expression before ‘if’
 #define xpath(smth, exp) if (sizeof(*smth) == sizeof(xmlNode)) { xpath_node((xml_node_ptr)smth, exp); } else{ xpath_doc((xml_doc_ptr)smth, exp); }
                          ^
/home/roroco/Dropbox/rbs/ro_sites/c/xml_parser_test.cpp:26:22: note: in expansion of macro ‘xpath’
     xml_node_ptr n = xpath(d, "/html/body");
                  ^

我的完整源代码是

您的代码正在扩展到

xml_node_ptr n = if (sizeof(*d) == sizeof(xmlNode)) { xpath_node((xml_node_ptr)d, "/html/body"); } else{ xpath_doc((xml_doc_ptr)d, "/html/body"); }

通过预处理器。很明显这是错误的。为了回答第二个问题,原表达式是C++语法中的预期非终结符。主表达式类似于算术、函数调用等。

看起来宏可以是常规函数。您能告诉我如何传递变量类型参数吗?@nwaicaethi您必须更具体。在我的代码
中定义xpath(smth,exp)
smth
可能
xml\u doc\u ptr
xml\u node\u ptr
,当
xml\u doc\u ptr
运行
xpath\u doc
时,当
xml\u node\u ptr
运行
xpath\u node
时,如何实现它?@nwaaicaethi基于类型的决策可以使用
typeid
操作符完成。尽管更好的解决方案可能是重构代码以使用某种多态解决方案。当然,如果可能的话。@nwacaethi如果我找到了解决方案,请使用
#define xpath(smth,exp)sizeof(*smth)==sizeof(xmlNode)?xpath\u node((xml\u node\u ptr)smth,exp):xpath\u doc((xml\u doc\u ptr)smth,exp)
而不是旧的