2015-03-27 11 views
5

में अतिरिक्त अर्धविराम की आवश्यकता है मैं विजुअल सी ++ 2013 में कुछ सी कोड संकलित कर रहा हूं (इसे सी में लिखा जाना है)।रिटर्न स्टेटमेंट को विजुअल स्टूडियो 2013

void drawDebugLines(vec2f pos, DebugControls *controls, vec2f dydx, vec2f p) 
{ 
    static float lineSize = 0.05f; 
    if (!controls->normalFlag && !controls->tangentFlag) 
    { 
     return; 
    } 
    vec3f nColor = cVec3f(1, 1, 0); 
    ... 

जैसा कि यह कोड संकलित और ठीक ठीक होगा।

error C2275: 'vec3f' : illegal use of this type as an expression 

संपादित करें::

अगर मैं उन घुंघराले ब्रेसिज़ बाहर ले, मैं निम्नलिखित संकलन त्रुटि मिलती बयान के लिए यह त्रुटि आती vec3f nColor

लेकिन अगर मैं के महायोग में डाल रिटर्न स्टेटमेंट (और कोई ब्रेसिज़) के बाद दो सेमीकॉलन, कोड भी संकलित और ठीक ठीक चलाएगा।

यह केवल विज़ुअल सी ++ में होता है, जीसीसी इस कोड को ब्रेसिज़ या अतिरिक्त अर्धविराम की आवश्यकता के बिना संकलित करेगा।

मेरा प्रश्न यह है कि विज़ुअल सी ++ ऐसा क्यों करता है? मुझे जवाब स्वीकार करने में प्रसन्नता हो रही है "विजुअल स्टूडियो का सी कंपाइलर एस *** है" लेकिन यह क्यों है *** यह कैसे है?

मैं मैं सब कुछ अंदर

#if __cplusplus 
extern "C" { 
#endif 
... 
#if __cplusplus 
} 
#endif 

लिपटे मुझे यकीन है कि अगर प्रासंगिक है नहीं कर रहा हूँ कि मेरी हेडर फाइल में कहना चाहिए, लेकिन मैंने सोचा कि मैं यह सिर्फ मामले में उल्लेख करना चाहिए।

संपादित करें: कोड तुम सिर्फ एक फाइल में फेंक और जादू गवाह कर सकते हैं:

अतिरिक्त संपादित करें: फ़ाइल नाम के लिए विस्तार, ग होना चाहिए अगर यह सीपीपी तो है कोड संकलित करता है।

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 

typedef struct vec3f vec3f; 

struct vec3f 
{ 
    float x, y, z; 
}; 

vec3f cVec3f(float x, float y, float z) 
{ 
    vec3f v; 
    v.x = x; 
    v.y = y; 
    v.z = z; 
    return v; 
} 

void drawDebugLines(vec3f pos, bool debug) 
{ 
    if (!debug) 
     return;; 

    vec3f nColor = cVec3f(1, 1, 0); 

    printf("nColor: %f %f %f\n", nColor.x, nColor.y, nColor.z); 
} 


int main(int argc, char **argv) 
{ 
    vec3f pos = cVec3f(0, 0, 0); 
    drawDebugLines(pos, true); 

    return EXIT_SUCCESS; 
} 

अतिरिक्त अर्धविराम निकालें और इसे तोड़ दें। यदि यह आपके लिए नहीं टूटता है और यह सिर्फ विज़ुअल सी ++ का मेरा संस्करण है जो ईमानदारी से विफल रहता है जो मुझे सबसे ज्यादा समझ में आता है।

+0

हां, cVec3f एक फ़ंक्शन है। संकलक उस के साथ ठीक है। – Blarglenarf

+1

क्या आप एक ऐसी फाइल बना सकते हैं जो इसे प्रदर्शित करे कि मैं विजुअल स्टूडियो पर भी फेंक सकता हूं? यदि आप 'int' कहने के लिए 'vec2f' और' vec3f' के सभी को बदलते हैं, तो क्या यह अभी भी होता है? –

+1

यह वास्तविक कोड नहीं हो सकता है, क्या आप फ़ंक्शन से वापस आने के लिए मैक्रो का उपयोग कर रहे हैं? साथ ही, फ़ंक्शन की शुरुआत में 'vec3f ncolor;' की घोषणा को स्थानांतरित करें, क्योंकि AFAIK विजुअल स्टूडियो सी कंपाइलर बयानों के साथ घोषणाओं को मिश्रण करना पसंद नहीं करता है, जो एक अच्छी बात है, आपको नहीं करना चाहिए। सी ++ में यह अलग है क्योंकि एक घोषणा वास्तव में कक्षा निर्माणकर्ता और आपके जैसे कोड में आ सकती है, ऐसा करने के लिए अनावश्यक होगा यदि आप 'ncolor' का उपयोग करने के लिए नहीं जा रहे हैं, लेकिन सी में, चिंता करने की कोई बात नहीं है। –

उत्तर

6

यह विजुअल स्टूडियो 2013 में सी कंपाइलर में एक बग था। यह Visual Studio 2013 Update 2 में तय किया गया था।

संबंधित मुद्दे