7

在 Qt 项目(带有 Qt 插件)上使用 Visual Studio,似乎总是抛出错误消息:

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 一起工作?

4

1 回答 1

3

考虑写作

this->setApplicationVersion( QString( TO_STRING( BUILD_VERSION ) ) );

whereTO_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 )
于 2012-08-12T17:36:43.390 回答