ΕΠΙΔΙΌΡΘΩΣΗ: Λανθασμένο κωδικό υπολογιστή δημιουργείται για μια δήλωση "διακόπτη" με το Visual C++ 2010 x 64 του μεταγλωττιστή

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 2802711 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Συμπτώματα

Ας υποθέσουμε ότι μεταγλώττιση αρχείου κώδικα C ή C++ προέλευσης σε ένα δυαδικό αρχείο που βασίζονται σε επεξεργαστή x 64, χρησιμοποιώντας το πρόγραμμα μεταγλώττισης Visual C/C++ (Cl.exe) στο Microsoft Visual Studio 2010. Αρχείο προέλευσης κώδικα περιέχει μια συνάρτηση η οποία χρησιμοποιεί μια δήλωση Εναλλαγή . Σε αυτήν την περίπτωση, λανθασμένο κωδικό μηχανή μπορεί να δημιουργηθούν για τη δήλωση διακόπτη , εάν ισχύουν οι ακόλουθες συνθήκες:
  • Είναι ενεργοποιημένη η επιλογή μεταγλωττιστή1 (Only_inline) /Ob.
  • Το /O1 (μέγεθος Ελαχιστοποίηση), /O2 (Μεγιστοποίηση της ταχύτητας), /Ox (πλήρους βελτιστοποίησης) ή επιλογή μεταγλωττιστή βελτιστοποίησης /Og (καθολικό βελτιστοποιήσεις) είναι ενεργοποιημένη.
  • Η επιλογή μεταγλωττιστή /GL (ολόκληρο πρόγραμμα βελτιστοποίησης) είναι απενεργοποιημένη.

Προτεινόμενη αντιμετώπιση

Πληροφορίες επείγουσας επιδιόρθωσης

Μια υποστηριζόμενη επείγουσα επιδιόρθωση είναι τώρα διαθέσιμη από τη Microsoft. Ωστόσο, προορίζεται για τη διόρθωση μόνο το ζήτημα που περιγράφει αυτό το άρθρο. Eφαρμόστε τη μόνο σε συστήματα που αντιμετωπίζουν το συγκεκριμένο ζήτημα.

Για να επιλύσετε αυτό το ζήτημα, επικοινωνήστε με υπηρεσίες υποστήριξης πελατών της Microsoft για να αποκτήσετε την επείγουσα επιδιόρθωση. Για μια πλήρη λίστα αριθμών τηλεφώνου υπηρεσίες υποστήριξης πελατών της Microsoft και πληροφορίες σχετικά με το κόστος υποστήριξης, επισκεφθείτε την ακόλουθη τοποθεσία Web της Microsoft:
http://support.Microsoft.com/contactus/?ws=support
Σημείωση Σε ειδικές περιπτώσεις, οι χρεώσεις που υφίστανται κανονικά για κλήσεις υποστήριξης μπορεί να ακυρωθεί εάν έναν επαγγελματία υποστήριξης της Microsoft κρίνει ότι μια συγκεκριμένη ενημερωμένη έκδοση θα επιλύσει το ζήτημά σας. Οι συνηθισμένες χρεώσεις υποστήριξης θα ισχύει για πρόσθετες ερωτήσεις υποστήριξης και για θέματα που δεν αφορούν τη συγκεκριμένη ενημερωμένη έκδοση.

Προϋποθέσεις

Για να εφαρμόσετε αυτήν την επείγουσα επιδιόρθωση, πρέπει να έχετε το Visual Studio 2010 Service Pack 1 (SP1) εγκατεστημένο.

Απαίτηση επανεκκίνησης

Δεν χρειάζεται να κάνετε επανεκκίνηση του υπολογιστή μετά την εφαρμογή αυτής της επείγουσας επιδιόρθωσης, εάν τα ενεχόμενα αρχεία δεν χρησιμοποιούνται. Συνιστάται να κλείσετε τα στοιχεία που σχετίζονται με το Visual Studio 2010 πριν να εφαρμόσετε αυτήν την επείγουσα επιδιόρθωση.

Πληροφορίες αρχείου

Η καθολική έκδοση αυτής της επείγουσας επιδιόρθωσης έχει τα χαρακτηριστικά αρχείου (ή νεότερα χαρακτηριστικά αρχείου) που παρατίθενται στον παρακάτω πίνακα. Οι ημερομηνίες και οι ώρες για αυτά τα αρχεία αναφέρονται σε συντονισμένη παγκόσμια ώρα (UTC). Όταν προβάλλετε τις πληροφορίες του αρχείου, τότε μετατρέπεται σε τοπική ώρα. Για να βρείτε τη διαφορά μεταξύ της ώρας UTC και της τοπικής ώρας, χρησιμοποιήστε το Ζώνη ώρας καρτέλα με το Ημερομηνία και ώρα στοιχείο στον πίνακα ελέγχου.
Σύμπτυξη αυτής της εικόναςΑνάπτυξη αυτής της εικόνας
assets folding start collapsed
Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
Όνομα αρχείουΈκδοση αρχείουΜέγεθος αρχείουΗμερομηνίαΏραΠλατφόρμαΔιαδρομή
C2.dll16.0.40219.4442,606,71211-Μαρ-201319:24x 86Microsoft Visual Studio 10.0\VC\bin
C2.dll16.0.40219.4442,493,56012-Μαρ-201316:48x 86Microsoft Visual Studio 10.0\VC\bin\x86_amd64
C2.dll16.0.40219.4442,593,92812-Μαρ-201316:48x 86Microsoft Visual Studio 10.0\VC\bin\x86_ia64
C2.dll16.0.40219.4442,960,50412-Μαρ-201316:48x 64Microsoft Visual Studio 10.0\VC\bin\amd64
Σύμπτυξη αυτής της εικόναςΑνάπτυξη αυτής της εικόνας
assets folding end collapsed

Περισσότερες πληροφορίες

Για να αναπαραγάγετε αυτό το ζήτημα, δημιουργήστε ένα αρχείο προέλευσης C ή C++ που περιέχει τον ακόλουθο κώδικα:

#include <stdio.h>

int test(int bps, int sflags)
{
    if (sflags & (1 << bps))
    {
        switch (bps)
        {
        case 1:  return 1;
        case 2:  return 3;
        default: return 0;
        }
    }
    else
    {
        switch (bps)
        {
        case 1:  return 2;
        default: return 0;
        }
    }
}
 
void main()
{
    int res = test(1, -1);
    printf("%d\n", res);
}


Στη συνέχεια, ανοίξτε το Visual Studio x 64 διασταυρώνεται με γραμμή εντολών εργαλείων ή Visual Studio x 64 Win64 εντολών στο Visual Studio 2010 και μεταγλωττίστε το αρχείο προέλευσης, χρησιμοποιώντας την ακόλουθη εντολή:
cl /Ob1 /O2 'Η διαδρομή του αρχείου προέλευσης'

Το αναμενόμενο αποτέλεσμα είναι 1. Ωστόσο, το πραγματικό αποτέλεσμα είναι 0.

Κατάσταση

Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα πρόβλημα στα προϊόντα της Microsoft που παρατίθενται στην ενότητα "Ισχύει για".

Αναφορές

Για περισσότερες πληροφορίες σχετικά με την επιλογή του μεταγλωττιστή της /Ob , μεταβείτε την ακόλουθη τοποθεσία MSDN στο Web: Για περισσότερες πληροφορίες σχετικά με την επιλογή του μεταγλωττιστή της /GL , μεταβείτε την ακόλουθη τοποθεσία MSDN στο Web: Για περισσότερες πληροφορίες σχετικά με τις Επιλογές βελτιστοποίησης /O , μεταβείτε την ακόλουθη τοποθεσία MSDN στο Web:

Ιδιότητες

Αναγν. άρθρου: 2802711 - Τελευταία αναθεώρηση: Παρασκευή, 29 Μαρτίου 2013 - Αναθεώρηση: 3.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual Studio 2010 Service Pack 1
  • Microsoft Visual Studio 2010 Ultimate
  • Microsoft Visual Studio 2010 Professional
  • Microsoft Visual Studio 2010 Premium with MSDN
Λέξεις-κλειδιά: 
kbqfe kbHotfixServer kbfix kbsurveynew kbexpertiseadvanced kbmt KB2802711 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη: 2802711

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com