簡體   English   中英

為什么/ Zc:twoPhase-編譯器開關在MSVC中不起作用?

[英]Why does the /Zc:twoPhase- compiler switch has no effect in MSVC?

為什么沒有/Zc:twoPhase-后面的編譯器開關/permissive-開關導致編譯錯誤在MSVC 19.13消失,就像他們消失時/許可,`開關被完全去除,用下面的問題代碼?

#include <stdio.h>

template <unsigned int BYTES>
class CBase
{
public:
    char Arr[BYTES];

    int Fn1(void) {
        return Arr[1] ^ Arr[sizeof(Arr)-1];
    }

    int Fn2(void) {
        return Arr[2] ^ Arr[sizeof(Arr)-2];
    }
};

template <unsigned int BYTES>
class CDerived : public CBase<BYTES>
{
public:

    int FnSum(void) {
        return Fn1() + Fn2() + Arr[0];  // ERRORs: identifiers "Fn1" and "Fn2" and "Arr" are NOT found !
    }
};    

int main(void)
{
    CDerived<32> ddd;

    printf("%d\n", ddd.Fn1());  //No error here
    printf("%d\n", ddd.Fn2());  //No error here
    printf("%d\n", ddd.FnSum());

    return (int)ddd.Arr[0];   //No error here
}

完全刪除/permissive-開關后,以上代碼將在MSVC v19.10中編譯。
請參閱: https//godbolt.org/g/Yxw89Y

注意:由於最新的Godbolt MSVC編譯器(v19.10)已過時且不支持/Zc:twoPhase- ,因此我無法在http://godbolt.org /permissive- /Zc:twoPhase-開關一起包含到示例的鏈接。 /Zc:twoPhase-編譯器開關。

根據本文本文 ,MSVC中的編譯錯誤來自通過遵循C ++標准模式(由/permissive-選項啟用)啟用的兩階段名稱查找。
同樣,根據前一篇文章 :“ /permissive-選項隱式設置符合條件的兩階段查找編譯器行為,但是可以使用/Zc:twoPhase- switch覆蓋它 ”。
但是,添加兩個編譯器開關/permissive- /Zc:twoPhase-/permissive- /Zc:twoPhase-順序)不會覆蓋它,並且不會使編譯錯誤在MSVC v19.13中消失。

有關此問題的上下文,請參閱此條目

使用/permissive- ,此代碼確實以VS 2017(15.7更新)版本19.14構建,因此,這可能只是VS 2017(15.6更新)中的編譯器錯誤已修復。 您的原始代碼與兩階段查找沒有任何關系。

如果代碼使用/permissive-出錯,然后使用/permissive- /Zc:twoPhase-進行構建,則它與兩階段相關。 否則,這僅僅是由於/permissive- switch強制執行了一致性。 請參見使Visual C ++轉換為標准符合性,並且MSVC提供了兩階段名稱查找支持

更新它使用x86而不是x64進行構建,這似乎強化了以下觀念:這是編譯器錯誤,而不是源代碼一致性問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM