Я получаю ошибки компиляции в стандартной библиотеке. Что происходит? - PullRequest
1 голос
/ 30 июля 2009

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

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

Ответы [ 7 ]

6 голосов
/ 30 июля 2009

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

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

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

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

2 голосов
/ 30 июля 2009

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

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

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

2 голосов
/ 30 июля 2009

Поскольку 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, которая могла вызвать это, но я Я не уверен, что это происходит в последних версиях. Я очень переживал из-за этого давным-давно, и был гораздо более осторожен с тем, какие переменные я позволил отдельным компиляторам устанавливать в глобальной среде с тех пор.

0 голосов
/ 24 ноября 2011

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

У меня было это (в несколько менее очевидной форме):

    namespace MyApp
    {

    #include "MyUtilities.hpp"

    };

    #include "MoreUtilities.hpp"

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

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

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

0 голосов
/ 30 июля 2009

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

0 голосов
/ 30 июля 2009

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

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

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

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

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

0 голосов
/ 30 июля 2009

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

Один из способов убедиться в этом - создать новое консольное приложение "hello world". Он будет включать stdio в stdafx.h.

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

Включен ли stdio в stdafx.h?

...