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++ 列表列表