VC++6 的预处理器问题
Preprocessor problems with VC++6
我正在将我的单个 header 库移植到 VC++6.
一个宏展开后出错。
当我 运行 C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
然后尝试从调用 cl.exe 的命令行编译 main.cpp
- 它起作用了。我还用 /EP
查看了预处理器输出,看起来不错。
我创建了一个空的控制台 win32 应用程序并添加了包含我的 header 的单个 .cpp
文件。我没有向该项目添加任何选项,因为......好吧...... IDE 在某些对话框中崩溃,因为它在 Windows 7.[=24 中 运行 不正常=]
同一个 .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
如果有人知道如何让 preprocessor/compiler 为默认项目配置工作,我将不胜感激。
除了不使用 1998 年的编译器,没有其他解决办法。
我正在将我的单个 header 库移植到 VC++6.
一个宏展开后出错。
当我 运行 C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
然后尝试从调用 cl.exe 的命令行编译 main.cpp
- 它起作用了。我还用 /EP
查看了预处理器输出,看起来不错。
我创建了一个空的控制台 win32 应用程序并添加了包含我的 header 的单个 .cpp
文件。我没有向该项目添加任何选项,因为......好吧...... IDE 在某些对话框中崩溃,因为它在 Windows 7.[=24 中 运行 不正常=]
同一个 .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
如果有人知道如何让 preprocessor/compiler 为默认项目配置工作,我将不胜感激。
除了不使用 1998 年的编译器,没有其他解决办法。