आप टर्नरी ऑपरेटर का उपयोग कर सकते हैं मैक्रो का परिणाम सीई एक rvalue होने के लिए है, लेकिन त्रुटि संदेश उपयोगकर्ताओं के लिए भ्रामक हो सकता है:
struct node {
node *left, *right;
};
#define LEFT(x) (true ? (x).left : (node*)0)
int main() {
node n;
// LEFT(n); // error
node *l = LEFT(n); // OK
}
प्रवंचना वहाँ है कि विशिष्ट ऑपरेटर के शब्दों में है। केवल ऑपरेटर युक्त अभिव्यक्ति का प्रकार अभिव्यक्ति की दो शाखाओं का एक सामान्य प्रकार (या एक प्रकार से परिवर्तनीय) है, भले ही उनमें से केवल एक का मूल्यांकन किया जाए। अब, जब संकलक true ? x.left : (node*)0
का मूल्यांकन करता है तो यह x.left
अभिव्यक्ति को हल करता है लेकिन x.left
और (node*)0
के सामान्य प्रकार के साथ। उनमें से दोनों मूल रूप से एक ही प्रकार के हैं, केवल विवरण के साथ (node*)0
एक लालसा के बजाए एक रैवल्यू है।
स्रोत
2011-04-15 11:29:15
उस मैक्रो का क्या उपयोग कर सकते हैं? मुझे समझ में नहीं आता कि आपको कभी ऐसा मैक्रो क्यों चाहिए। – Lundin
@ लंदन मैं इसे उदाहरण के रूप में लेता हूं। वास्तविक कोड के लिए बहुत सारे गहरे-संरचित सदस्य हैं, एक्सेसर-मैक्रोज़ उपयोगी होंगे। – wsxiaoys
@wsxiaoys ठीक है मैं देखता हूँ। मैं इस तरह के मैक्रोज़ को कैसे करना चाहिए इसके उदाहरण के साथ एक उत्तर पोस्ट करूंगा। – Lundin