2009-07-30 4 views
1

Я пытаюсь скомпилировать неуказанную часть программного обеспечения, и я получаю ошибки в стандартных заголовках, таких как stdio.h. Ошибки в основном являются необъявленными идентификаторами, такими как _In_. IntelliSense находит свои определения просто прекрасными. В каком общем направлении я должен искать причину этого?Я получаю ошибки компиляции в стандартной библиотеке. Что происходит?

Добавлено: Например, в одном файле cpp stdio.h - это первый включенный файл - нет никаких определений, которые я могу увидеть перед ним. Нет предварительно скомпилированных заголовков. Другие вещи на моей установке компилируются просто отлично.

+1

Вы можете написать сообщение об ошибке и пример минимального кода, который воспроизводит его? Мое предположение было бы в том, что некоторые из препроцессоров определяют неправильные/дублированные/не заданные, но без каких-либо действий для этого просто предположение. –

+0

Да, но Visual Studio имеет набор параметров проекта, которые включают в себя параметры препроцессора, а также некоторые параметры для каждого файла. –

+0

опубликуйте содержимое файла, содержащего stdio.h (или урезанный пример, который имеет ту же проблему) – jalf

ответ

6

«Вы делаете что-то неуказанное неправильно» - это лучшее, что я могу сделать.

Стандартная библиотека компилируется, я могу сказать вам многое.

Так как конфигурация проекта не так, или что-то в вашем коде влияет включенный файл (возможно, некоторые плохие #defines, например)

Если вы хотите получить более конкретный ответ, вы должны дать нам некоторой конкретной информации. Какие ошибки вы получаете? Как файл включен? Можете ли вы показать минимальный код, который воспроизводит проблему?

+0

Ну, это Visual Studio, в конце концов, так что вы никогда не знаете :). Время переключиться на gcc ... –

+15

, потому что в gcc невозможно сделать ошибки, не так ли? Компилятор волшебным образом обнаруживает, что вы хотите сделать, и записывает свой код для вас * и * устанавливает флаги компилятора. Позор Microsoft не думал об этом, когда писал свой компилятор ... Прошу прощения, чтобы разбить ваш пузырь, но любой компилятор C++ позволяет вам: 1) писать код, который разбивает стандартную библиотеку, и 2) указывать флаги компилятора что делает невозможным компиляцию вашего кода. – jalf

+3

Чтобы быть справедливым, gcc не хранит флаги компилятора, в том числе препроцессор, определяет в неясных местах, которые трудно воспроизвести при описании вашей среды сборки. Для этого и есть цель. –

0

Стандартная строка должна компилироваться. Однако, если вы изменили или удалили некоторые файлы в заголовках, поставляемых с установкой Visual Studio, вы столкнулись с проблемами и вам придется переустановить все.

Один из способов убедиться в том, чтобы создать новое консольное приложение «привет мир». Он будет включать stdio в stdafx.h.

Я не думаю, что это ваша проблема, и вы должны дать более подробную информацию о проблеме, если хотите получить лучший ответ.

Является ли stdio включенным в stdafx.h?

+0

или еще лучше, не сначала используйте предварительно скомпилированный заголовок. Когда вы пытаетесь выяснить, нарушен ли ваш компилятор, это тем более разумно, что это просто. – jalf

2

Поскольку VS любит использовать предварительно скомпилированные заголовки, вам может потребоваться убедиться, что вы не нарушили какие-либо предположения. Один из источников проблемы - назвать любой заголовок вообще впереди линии, которая включает stdafx.h.

Даже без проблем с предварительно скомпилированными заголовками вы можете непреднамеренно определить что-то, что плохо связано с определениями в заголовках запаса. Если вы заглянете внутрь stdio.h, вы увидите, что он имеет ряд интересных условных разделов компиляции, так как тот же файл распространяется на несколько различных платформ. Обязательно посмотрите настройки вашего проекта, и если проблема возникает только при компиляции определенного исходного файла, то и в настройках компиляции этого файла.

Это, безусловно, стоит начать новый проект и проверить, если хороший ол»hello.c может быть собран ...

#include <stdio.h> 
int main(int argc, char **argv) { 
    printf("hello, world.\n"); 
    return 0; 
} 

, если нет, то есть что-то серьезно не так с установкой VS.

Еще один возможный, но маловероятный источник проблем будет, если у вас установлены другие компиляторы, и каким-то образом случайно получил VS, используя еще один stdio.h ... Неправильная переменная среды INCLUDE, используемая, чтобы иметь возможность вызвать это, m не уверен, что это происходит в последних версиях. Я был сожжен этим давно, и был гораздо более осторожен в отношении того, какие переменные я позволяю отдельным компиляторам устанавливать в глобальной среде с тех пор.

2

Возможности:

  • Компиляция с неправильными флагами. В частности, ваши включенные пути заданы неправильно, вы компилируете для C++ вместо C, что-то вдоль этих строк.
  • Вы включаете вещи перед заголовком, которые переопределяют вещи внутри стандартных заголовков. Ваш вопрос делает этот звук маловероятным.
  • Вы определяете вещи в командной строке компилятора, которые запутывают вещи.
  • Ваших заголовков неправильно, неправильно, не предназначено для использования с версией компилятора и т.д.
  • Вашего компилятор неправильна, неправильно, не соответствующие стандарты и т.д.

Лучшей диагностика для сброса предварительно обработанного источника. У каждого компилятора есть опция для этого. Я считаю, что это -E на gcc, проверьте параметры документов или gui для визуальной студии.

0

Ошибки в основном необъявленные идентификаторы, такие как _In_. IntelliSense находит свои определения просто прекрасными. В каком общем направлении я должен искать причину этого?

Необъявленная идентификатор, вероятно, означает, что ваш стандартный заголовок сам пытается include другой заголовок (внутренне), не найдя его, и, следовательно, не получают идентификаторы должным образом объявлены/определены.

Добавлено: Например, в одном файле cpp stdio.h является первым включенным файлом - нет никаких определений, которые я могу увидеть перед ним.

A define отличается от декларации, которая отличается от определения. Вы, наверное, уже знаете это, но я просто хочу быть уверенным.

Поскольку вопрос отмечен как C++, я бы рекомендовал вам includecstdio вместо stdio.h. Вероятно, это не исправит ошибку компилятора, но это официальный заголовок C++. В системах POSIX вы иногда обнаружите, что стандартные заголовки C расширяются с помощью вещей из POSIX. По моему опыту, у вас нет одинаковых расширений в версиях C++ - ified этих заголовков.

0

Я думаю, что иногда несоответствие между различными версиями библиотеки заголовков может также вызвать это. Вы недавно устанавливали новые версии стандартных библиотек, например, с SDK или что-то еще, или играли с PATH и тому подобное?

0

Это случилось со мной сегодня, и мне потребовалось четыре расстраивающих часа, чтобы решить эту проблему, даже после поиска ответов на этом форуме, поэтому позвольте мне опубликовать мою проблему и ее решение в случае, если это произойдет снова для кого-либо еще.

Я это (в несколько менее явной форме):

namespace MyApp 
    { 

    #include "MyUtilities.hpp" 

    }; 

    #include "MoreUtilities.hpp" 

Оба MyUtilities.hpp и MoreUtilities.hpp включены <wait.h>, но вторая попытка (библиотекой) для использования стандартной системы типа sigval_t внутри MoreUtilities .hpp бросил ошибку компилятора (в стандартной библиотеке).Что касается исходного плаката, это была первая ошибка, обнаруженная компилятором; для меня это вызвало раздражающую ошибку «Тип не найден», которая казалась явно неправильной, учитывая, что это стандартный тип, и это было «не в моем коде».

Второе включение <wait.h> не генерирует новый код, поскольку определения уже были сделаны. Однако они не были найдены компилятором из-за того, что они находятся в другом пространстве имен.

Решение, конечно же, должно быть #include <standard-header.h> за пределами всех локальных заявлений пространства имен.

 Смежные вопросы

  • Нет связанных вопросов^_^