VC ++ 6的预处理器问题

时间:2016-04-29 14:19:15

标签: c++ visual-studio visual-c++ c-preprocessor

我将单个头库移植到VC ++ 6。

一个宏在扩展后出现错误。

当我运行C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT然后尝试从命令行调用cl.exe编译main.cpp时 - 它工作正常。我还用/EP查看了预处理器输出,看起来很好。

我创建了一个空的控制台win32应用程序并添加了包含我的标题的单个.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

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

1 个答案:

答案 0 :(得分:1)

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