gpt4 book ai didi

c++ - VC++6 的预处理器问题

转载 作者:行者123 更新时间:2023-11-28 05:41:48 25 4
gpt4 key购买 nike

我正在将我的单个头文件库移植到 VC++6。

一个宏在展开后出错。

当我运行 C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT 然后尝试从命令编译 main.cpp线路调用 cl.exe - 它有效。我还使用 /EP 查看了预处理器输出,看起来不错。

我创建了一个空的控制台 win32 应用程序并添加了包含我的 header 的单个 .cpp 文件。我没有向项目添加任何选项,因为......好吧......IDE 在某些对话框上崩溃,因为它在 Windows 7 上运行不佳。

同一个 .cpp 文件可以用 mingw 和 gcc 以及任何东西编译 - 它是简单的可移植代码。

相关代码是这样的:

#define DOCTEST_STR_CONCAT_IMPL(s1, s2) s1##s2
#define DOCTEST_STR_CONCAT(s1, s2) DOCTEST_STR_CONCAT_IMPL(s1, s2)
#define DOCTEST_ANONYMOUS(x) DOCTEST_STR_CONCAT(x, __LINE__)

#define DOCTEST_SUBCASE(name) \
if(const doctest::detail::Subcase & DOCTEST_ANONYMOUS(DOCTEST_AUTOGEN_SUBCASE_) = \
doctest::detail::Subcase(name, __FILE__, __LINE__))

// and in main.cpp:
void f() {
DOCTEST_SUBCASE("") {}
}

在预处理器之后(从带有 /EP 的命令行)我得到了这个(很好并且可以编译):

if(const doctest::detail::Subcase & DOCTEST_AUTOGEN_SUBCASE_20 =
doctest::detail::Subcase("", "C:\\VC6_TESTS\\doctest\\main.cpp", 20)) {}

从 IDE 中编译时的错误是这样的:

C:\VC6_TESTS\doctest\main.cpp(20) : error C2061: syntax error : identifier '__LINE__Var'
C:\VC6_TESTS\doctest\main.cpp(20) : error C2072: 'DOCTEST_AUTOGEN_SUBCASE_' : initialization of a function

知道为什么在 IDE 中我可能会出现不良的预处理器行为,以及为什么它可以在命令行中运行吗?或者至少建议尝试什么...

请不要告诉我不要使用 VC++6 - 我知道它已经 18 岁了,但移植我的库是一种荣誉。

编辑:

这原来是一个编译器错误。

从调试信息中关闭 Edit and Continue 解决了问题(/ZI 命令行选项)

这是重现问题的最小示例代码:

#define STR_CONCAT_IMPL(s1, s2) s1##s2
#define STR_CONCAT(s1, s2) STR_CONCAT_IMPL(s1, s2)
#define ANONYMOUS(x) STR_CONCAT(x, __LINE__)

struct Subcase
{
Subcase(const char* name, const char* file, int line) {}
operator bool() const { return true; }
};

#define MYMACRO(name) if(const Subcase & ANONYMOUS(AUTOGEN_VARIABLE_) = Subcase(name, __FILE__, __LINE__))

int main() {
MYMACRO("") {}
return 0;
}

以及传递/ZI时的错误:

c:\vc6_tests\doctest\main.cpp(19) : error C2061: syntax error : identifier '__LINE__Var'
c:\vc6_tests\doctest\main.cpp(19) : error C2072: 'AUTOGEN_VARIABLE_' : initialization of a function

如果有人知道如何欺骗预处理器/编译器为默认项目配置工作,我将不胜感激。

最佳答案

除了不使用 1998 年的编译器之外,没有其他解决方案。

关于c++ - VC++6 的预处理器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36940730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com