none
C++, Hello, world !" RRS feed

  • Pergunta

  • Всем привет!

    После многих-многих лет понадобился Cpp...
    Забыл и то, что знал, и то, что не знал...

    Простое дело - 
    main - в одном файле M.cpp,
    вызываемая прога  в другом файле - H.cpp
    Оба файла видны в обозревателе решений,
    в файлах исходного кода.
    Транслирую, ругается -
    C3861 H: идентификатор не найден
    К чему бы это?
    #include "stdafx.h"
    #include <iostream>
    #include <cstdio>
    int	main() { H(); }
    
    #include "stdafx.h"
    #include <iostream>
    #include <cstdio>
    void H()
    {
    	std::cout << "Hello, world !" << std::endl;
    }
    


    domingo, 7 de fevereiro de 2021 12:26

Respostas

  • >А я с Cpp давным-давно не дружу...

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

    >Куча сообщений об ошибках.

    1. В .h файле не должно быть #include "stdafx.h". Предкомпилированные заголовки должны включаться в каждый cpp файл только один раз, и в самом начале файла. Либо можно их отключить, опять же, в простом проекте они только мешают.

    2.  В H.h нужно включить то, что я привел ранее

    extern void H();

    segunda-feira, 8 de fevereiro de 2021 09:35
  • Все получилось.
    Окончательный вариант.

    Файл M.cpp -
    #include "stdafx.h"
    #include <iostream>
    #include <cstdio>
    #include "H.h"
    int main () { H (); }

    Файл H.cpp -
    #include "stdafx.h"
    #include <iostream>
    #include <cstdio>
    void H ()
    {
    std::cout << "Hello, world !" << std::endl;
    }

    Файл H.h -
    extern void H();

    Меня такой вариант пока устраивает.

    Спасибо!


    • Editado QazRdx segunda-feira, 8 de fevereiro de 2021 10:55
    • Marcado como Resposta QazRdx sexta-feira, 12 de fevereiro de 2021 02:44
    segunda-feira, 8 de fevereiro de 2021 10:54

Todas as Respostas

  • А где include H.cpp в M.cpp?
    domingo, 7 de fevereiro de 2021 20:15
  • К тому что на момент использования H не определен. Он будет определен только несколькими строками ниже.

    Для решения проблемы следует либо добавить декларацию H до использования, либо использовать после определения путем перестановки строк.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    domingo, 7 de fevereiro de 2021 22:18
    Moderador
  • PetSerAl - "А где include H.cpp в M.cpp?"
    #include H.cpp
    #include H.obj
     Или как?

    (MSFT) - "...добавить декларацию H до использования..."

    Это как? Я не знаю.

    Подскажите, пожалуйста!




    • Editado QazRdx segunda-feira, 8 de fevereiro de 2021 05:19
    segunda-feira, 8 de fevereiro de 2021 05:18
  • В простейшем случае можно дописать перед использованием H: 

    extern void H();

    Но в реальном проекте, конечно, нужно выделять объявления в заголовочные файлы и подключать их, а не дописывать поодиночке. Тут проблема не в порядке как таковом, а том, как организовать структуру проекта. В C# можно разделить проект на сколько угодно файлов, и они будут все "видеть" друг друга. В С++ же это не работает, нужно подключать объявления для всех внешних символов.

    segunda-feira, 8 de fevereiro de 2021 06:24
  • С extern - ом не надо, 
    надо, чтобы было как надо.

    Файл M.cpp
    #include "stdafx.h"
    #include <iostream>
    #include <cstdio>
    #include "H.h"     // Вставил заголовок
    int main() { H (); }

    Файл H.cpp
    #include "stdafx.h"
    #include <iostream>
    #include <cstdio>
    void H ()
    {
    std::cout << "Hello, world !" << std::endl;
    }

    Сообщение - 
    fatal error C1083: Не удается открыть файл включение: H.h: No such file or directory

    Оба файла, M.cpp и H.cpp находятся в одной папке.
    Что здесь не так?

    • Editado QazRdx segunda-feira, 8 de fevereiro de 2021 07:22
    segunda-feira, 8 de fevereiro de 2021 07:20
  • Суть в том, что определенного "как надо" не существует. Как именно делить проект С++ на файлы, зависит от того, чего вы хотите добиться, а также от личных предпочтений. Можно сделать файл H.h, в дополнение к файлу H.cpp, с объявлением функции, и подключить его к M.cpp. Можно поместить само тело функции в H.h, сделав ее inline, и вовсе избавиться от файла H.cpp. Естественно, файл H.h надо физически создать, чтобы он был в проекте. 

    Если вы пишете простые программы, возможно вам все это и не нужно. Ничто не мешает напихать весь код в один файл, благо навигация в Visual C++ работает отлично.

    segunda-feira, 8 de fevereiro de 2021 07:44
  • Да, нет.
    Пишу нечто "огромное" на C#,
    но надо подключить библиотеку SOFA, 
    Standards Of Fundamental Astronomy,
    - астрономические вычисления.
    А эта библиотека на C в исходных кодах
    достаточно большого объема, 
    причем для всех возможных платформ.
    Из всей библиотеки нужно выбрать нужные модули
    и как-то их подключить к моей проге.
    Вот такая у меня "великая" миссия.
    А я с Cpp давным-давно не дружу...
    segunda-feira, 8 de fevereiro de 2021 07:59
  • В ту же папку добавил заголовочный файл H.h

    #pragma once
    #include "stdafx.h"
    #include <iostream>
    #include <cstdio>
    void H.cpp ();

    Куча сообщений об ошибках.

    segunda-feira, 8 de fevereiro de 2021 08:48
  • >А я с Cpp давным-давно не дружу...

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

    >Куча сообщений об ошибках.

    1. В .h файле не должно быть #include "stdafx.h". Предкомпилированные заголовки должны включаться в каждый cpp файл только один раз, и в самом начале файла. Либо можно их отключить, опять же, в простом проекте они только мешают.

    2.  В H.h нужно включить то, что я привел ранее

    extern void H();

    segunda-feira, 8 de fevereiro de 2021 09:35
  • Все получилось.
    Окончательный вариант.

    Файл M.cpp -
    #include "stdafx.h"
    #include <iostream>
    #include <cstdio>
    #include "H.h"
    int main () { H (); }

    Файл H.cpp -
    #include "stdafx.h"
    #include <iostream>
    #include <cstdio>
    void H ()
    {
    std::cout << "Hello, world !" << std::endl;
    }

    Файл H.h -
    extern void H();

    Меня такой вариант пока устраивает.

    Спасибо!


    • Editado QazRdx segunda-feira, 8 de fevereiro de 2021 10:55
    • Marcado como Resposta QazRdx sexta-feira, 12 de fevereiro de 2021 02:44
    segunda-feira, 8 de fevereiro de 2021 10:54