在Qt项目上使用Visual Studio(使用Qt插件),似乎总是会抛出错误消息:
error C2001: newline in constant
从以下一行:
this->setApplicationVersion(QString(BUILD_VERSION));
或者每当我使用我的QMake文件中定义的编译器常量时。 BUILD_VERSION在我的QMake构建配方中定义,如果我使用不同的IDE(即使我使用相同的MSVC编译器,一切正常),编译项目也能成功运行。
我想我在Qt插件或Visual Studio中缺少首选项,或者我需要在我的QMake文件之外重新定义我的常量等...
常量由Intellisense定义并选取:
#define BUILD_VERSION \"0.1.0\"
发现问题是为了逃避常量中的引号,在Visual Studio中这不起作用,但它可以在命令行上使用Mingw和MSVC编译器。在没有转义的情况下定义常量可以使用Visual Studio:
#define BUILD_VERSION "0.1.0"
问题是在QMake文件中定义常量,我需要像以下一样转义:
#define BUILD_VERSION \\\"0.1.0\\\"
有没有办法在QMake文件中定义它们并让它们与Visual Studio一起使用?
答案 0 :(得分:3)
考虑写作
this->setApplicationVersion( QString( TO_STRING( BUILD_VERSION ) ) );
其中TO_STRING
将某些内容转换为字符串:
#include <iostream>
using namespace std;
#define TO_STRING_AUX( x ) #x
#define TO_STRING( x ) TO_STRING_AUX( x )
#define BUILD_VERSION 0.1.0
int main()
{
cout << TO_STRING( BUILD_VERSION ) << endl;
}
我没有QMake,但我认为问题在于QMake做了类似TO_STRING
的操作,然后我自己这样做,正如我先提到的那样,是一个通用的解决方案。
<小时/> 编辑: @sixones在后续评论中要求
这是使用TO_STRING时发出的警告;警告C4003:宏'TO_STRING_AUX'的实际参数不够,任何想法如何解决?
问题显然是作为参数传递的宏被定义为无(未定义,但未定义)。
解决方案是使用C99 / C ++ 11 可变参数宏定义,如下所示:
#define TO_STRING_AUX( ... ) "" #__VA_ARGS__
#define TO_STRING( x ) TO_STRING_AUX( x )