Visual Studio – zmienna w header i source

Visual Studio – zmienna w header i source
LI
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:4
0

Witam! ;>
Mam czysto teoretyczne pytanie.
Otóż w pliku source (C++) tworzę sobie byle jaką zmienną załóżmy typu int, wszystko ok w pliku cpp ją odczytuje, natomiast pomimo deklaracji przez extern w pliku nagłówkowym nie mogę jej tam wykorzystywać. Moje pytanie czy prócz extern da się ją jakoś dorzucić do pliku .h ?
Tak jestem zielony w aplikacjach okienkowych. ;)

edytowany 1x, ostatnio: flowCRANE
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0

to nie ma nic do okienek.

Pokaż to kodem, bo niewiele wynika


Bo C to najlepszy język, każdy uczeń ci to powie
LI
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:4
0
Kopiuj
#pragma once
namespace Project1 {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	
	extern int przyklad2;
	extern int przyklad1;

	/// <summary>
	/// Podsumowanie informacji o MyForm
	/// </summary>
	public ref class MyForm : public System::Windows::Forms::Form
	{
	public:
		MyForm(void)
		{
			InitializeComponent();
			//
			//TODO: W tym miejscu dodaj kod konstruktora
			//
		}

	protected:
		/// <summary>
		/// Wyczyść wszystkie używane zasoby.
		/// </summary>
		~MyForm()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Label^  label1;
	protected:

	private:
		/// <summary>
		/// Wymagana zmienna projektanta.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Metoda wymagana do obsługi projektanta — nie należy modyfikować
		/// jej zawartości w edytorze kodu.
		/// </summary>
		void InitializeComponent(void)
		{
			this->label1 = (gcnew System::Windows::Forms::Label());
			this->SuspendLayout();
			// 
			// label1
			// 
			this->label1->AutoSize = true;
			this->label1->Location = System::Drawing::Point(654, 158);
			this->label1->Name = L"label1";
			this->label1->Size = System::Drawing::Size(35, 13);
			this->label1->TabIndex = 0;
			this->label1->Text = L"label1";
			this->label1->Click += gcnew System::EventHandler(this, &MyForm::label1_Click);
			// 
			// MyForm
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(1395, 603);
			this->Controls->Add(this->label1);
			this->Name = L"MyForm";
			this->Text = L"MyForm";
			this->ResumeLayout(false);
			this->PerformLayout();

		}

	private: System::Void label1_Click(System::Object^  sender, System::EventArgs^  e) {

		label1->Text = Convert::ToString (przyklad2);
	}
	};
}
#pragma endregion
Kopiuj
int przyklad2 = 2;



#include "MyForm.h"

using namespace System;
using namespace System::Windows::Forms;

 

[STAThread]
void main(array<String^>^ array)
{
	int przyklad1 = 1;



	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false);
	Project1::MyForm form;
	Application::Run(%form);

}

Błędy np:

Kopiuj
Błąd	LNK2001	nierozpoznany symbol zewnŕtrzny "int Project1::przyklad2" (?przyklad2@Project1@@3HA)	Project1
Lub przyklad 1 lub 2 nie jest zdefiniowany
edytowany 3x, ostatnio: flowCRANE
AK
to nie jest C++ tylko C++CLI, de facto inny język choć pomyślany jako podobny https://4programmers.net/Forum/C_i_.NET/196733-o_naduzywaniu_c++cli najgorszy wybór, kumulujący wady jednego środowiska i drugiego
Azarien
Bez przesady z tym „inny język choć pomyślany jako podobny” - to jest 100% C++ (minus chyba dwa nowe keywordy) rozszerzony o rzeczy z C++. Kiedyś skompilowałem cały wielki Qt w trybie C++/CLI. To coś mówi o zgodności C++/CLI z C++.
06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
3

Deklaracja przyklad2 jest w przestrzeni Project1, a definicja nie. Zmienna przyklad1 jest zmienną lokalną, więc deklaracja z extern nic tu nie da.

AK
to właśnie jak mówiłem łączy wady obu jęzuków i nie daje nowych zalet
06
Błędy, które zrobił, są typowe dla C/C++, CLI nie ma nic tutaj do rzeczy.
AK
nie mów mi, że własny kod typowo się umieszcza w namespace, bo mnie zdziwisz
06
A co to ma do rzeczy? Te błędy spokojnie odtworzysz w czystym C++.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.