Windows Visual C++ 2019 试图传递预处理器变量(Linux 中的 -D)错误 C2143:语法错误:缺少 ';'在“常数”之前

Posted

技术标签:

【中文标题】Windows Visual C++ 2019 试图传递预处理器变量(Linux 中的 -D)错误 C2143:语法错误:缺少 \';\'在“常数”之前【英文标题】:Windows Visual C++ 2019 trying to pass preprocessor varible (-D in linux ) error C2143: syntax error: missing ';' before 'constant'Windows Visual C++ 2019 试图传递预处理器变量(Linux 中的 -D)错误 C2143:语法错误:缺少 ';'在“常数”之前 【发布时间】:2020-08-02 15:23:58 【问题描述】:

我正在做从 Linux 到 Windows 的简单移植,现在在 Linux 中我通过了简单 -DVERSION=1 能够获取预处理器宏中的值: 例如:

#define APP_NAME  "MyApp " VERSION

当我在 Windows 中设置 VERSION 值时: 配置属性、C/C++、预处理器 -> 预处理器定义 如:

VERSION=1

我明白了:

error C2143: syntax error: missing ')' before 'constant'

如果 VERSION 在其他地方定义,例如:

 char *message = (char*)"MyApp " VERSION "\0";

得到同样的结果:

error C2143: syntax error: missing ';' before 'constant'

当我将鼠标指向 VERSION 定义时,我确实看到它设置为 1

【问题讨论】:

我看到与 gcc 相同的错误:godbolt.org/z/766n4P 请提供minimal reproducible example 添加引号适用于 MSVC 和 gcc:godbolt.org/z/Pqz7x9 【参考方案1】:

VERSION=1

然后VERSION 扩展为整数 字面量1,这意味着你的语句是这样的:

char *message = "MyApp " 1 "\0";

这是无效的,因为您不能将字符串文字与整数文字连接起来。为此,您需要将 VERSION 定义为 string 文字:

VERSION="1"

至于APP_NAME 宏,您也有类似的问题。一种解决方案与上述相同,将VERSION 定义为字符串。但另一个是使用 poreprocessor 串联运算符##

#define APP_NAME  "MyApp " ## VERSION

或者使用预处理器“stringify”操作符#

#define APP_NAME  "MyApp " #VERSION

【讨论】:

以上是关于Windows Visual C++ 2019 试图传递预处理器变量(Linux 中的 -D)错误 C2143:语法错误:缺少 ';'在“常数”之前的主要内容,如果未能解决你的问题,请参考以下文章

Windows Visual C++ 2019 试图传递预处理器变量(Linux 中的 -D)错误 C2143:语法错误:缺少 ';'在“常数”之前

Windows Visual Studio C++ 列表列表

在 Visual Studio 2019 C++ 中安装库

如何在 Visual Studio 2017 中创建 C++ Windows 桌面应用程序?

Microsoft visual c++弹窗?

无法在 Windows 7 机器上的 Microsoft Visual C++ 2010 中运行 OpenCV