2016-04-29 78 views
0

我將我的單個頭文件庫移植到VC++ 6中。VC++的預處理器問題6

一個宏,但它擴展後的錯誤。

當我運行C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT,然後嘗試編譯main.cpp從命令行調用cl.exe - 它的工作。我也看着/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 

任何想法爲什麼fr om在IDE中我可能會遇到不好的預處理器行爲,以及它爲什麼會從命令行工作?或至少有一個建議什麼嘗試...

請不要告訴我不要使用VC++ 6 - 我知道這是18歲,但它是我的圖書館移植的榮譽問題。

編輯:

這竟然是一個編譯器錯誤。

從固定的問題(該/ZI命令行選項)

這裏調試信息關閉Edit and Continue是能重現問題最小示例代碼:當/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 

如果任何人有一個想法如何欺騙預處理器/編譯器工作對於默認的項目配置,我將不勝感激。

+2

編譯器無解,你會看到它是如何最終調用cl.exe時和比較選擇它正在向通過命令行手動傳遞的人員指定。這可能是開始診斷問題的好方法。 –

+0

@BrianFairservice聖潔的狗屎!謝謝!我在命令行添加了'''/ nologo/MLd/W3/Gm/GX/ZI/Od/D「WIN32」/ D「_DEBUG」/ D「_CONSOLE」/ D「_MBCS」'''也在那裏轉載 – onqtam

+0

我沒有downvote。很高興,但幫助! –

回答

1

目前除了沒有如果增加生成輸出的詳細程度,看看它在IDE中使用來自1998年