বিভিন্ন ব্লকের একই নামের বহিরাগত স্থানীয় ভেরিয়েবলগুলি সি ++ তে সংকলকগুলির মধ্যে বিভিন্ন লিঙ্কেজ কেন পাবে?


12

বাহ্যিক স্থানীয় ভেরিয়েবলগুলিতে কোন লিঙ্কেজগুলি মঞ্জুর করা হচ্ছে তা আমি যখন যাচ্ছিলাম তখন
আমি দেখতে পেলাম যে সংযোজকগুলির মধ্যে কিছু ভিন্ন আচরণ রয়েছে

উদাহরণস্বরূপ, যদি আমি কোডের নীচে পরীক্ষা করে
দেখি যেমন আপনি মন্তব্যগুলিতে দেখেন তবে varএর বিভিন্ন লিঙ্ক রয়েছে

// foo.cpp
int var = 10;                // external linkage

// main.cpp
#include <iostream>

static int var = 100;        // internal linkage

int main() {
    extern int var;          // internal linkage
    std::cout << var << std::endl;
    {
        extern int var;      // g++: external linkage , clang++: internal linkage
        std::cout << var << std::endl;
        {
            extern int var;  // g++: external linkage , clang++: internal linkage
            std::cout << var << std::endl;
        }
    }
}       

ফলাফল হলো

  • g ++: "100 10 10"
  • ঝনঝন ++: "100 100 100" (এমএসভিসি ++)

আমি ফলাফলটি থেকে দেখতে পাচ্ছি যে যদি দুটি অধিক নেস্টেড ব্লক থাকে তবে
g ++ কেবল ভেরিয়েবলগুলিতে বাহ্যিক সংযোগ দেয়

আমি স্ট্যান্ডার্ডে সম্পর্কিত বাক্যাংশটি খুঁজে পেতে পারি
তবে এটি এখনও অস্পষ্ট কারণ এর আচরণটি সংকলকগুলির দ্বারা পৃথক
( https://eel.is/c++traft/basic.link#6 )

আমার আশংকা আছে যে আমার ইংরেজি খারাপ তাই আমি এটি সঠিকভাবে পেতে পারি না
কারও যদি ধারণা থাকে যে কোন সংকলকগণ মানটিকে ভালভাবে মেনে চলেছে
এবং যদি সম্ভব হয় তবে কেউ যদি আমার কাছে স্ট্যান্ডার্ডটি সম্পর্কে ঠিক কী বলে যায় তবে তা বিস্তারিতভাবে ব্যাখ্যা করতে পারে?


1
সম্পর্কিত স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ৪৯১৮৮৯৯ 49 /… আমি বিশ্বাস করি এটি একটি জিসিসি বাগ, মানকটি f()ফাংশন সহ উদাহরণ দেয় এবং extern void f()অভ্যন্তরীণতমটির অভ্যন্তরীণ যোগসূত্র থাকে - varএখানেও অভ্যন্তরীণ সংযোগ থাকতে হবে, কারণ এটি একই "সত্তা" বোঝায়।
কামিলকুক

বাহ্যিক সংযোগ সহ আইএমওর ব্লক স্কোপ ঘোষণাগুলি হ'ল দুষ্ট এবং তাদের নিষিদ্ধ করার সাথে ভাষা আরও ভাল হবে
এমএম

@ এমএম: মডিউল ইউনিট এটি করে!
ডেভিস হেরিং

উত্তর:


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.