我將我的單個頭文件庫移植到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
如果任何人有一個想法如何欺騙預處理器/編譯器工作對於默認的項目配置,我將不勝感激。
編譯器無解,你會看到它是如何最終調用cl.exe時和比較選擇它正在向通過命令行手動傳遞的人員指定。這可能是開始診斷問題的好方法。 –
@BrianFairservice聖潔的狗屎!謝謝!我在命令行添加了'''/ nologo/MLd/W3/Gm/GX/ZI/Od/D「WIN32」/ D「_DEBUG」/ D「_CONSOLE」/ D「_MBCS」'''也在那裏轉載 – onqtam
我沒有downvote。很高興,但幫助! –