C++ pch-warnung: unbekannter fehler. es wurde keine intellisense pch-datei generiert.


Guten Tag Ich stehe vor einem kleinen Problem. Ich habe hier C++ Klassen, die sollen zu Visual Studio 2003 bis 2019 kompatibel sein. (Visual Studio 2003 wird benötigt, da hier noch etliche Industrie-PC's & Maschinen mit W2K/WinXP laufen und ich Programme dafür schreiben soll.) Das Problem ist dass die alten Visual Studio StdAfx.h und die Neuen Pch.h verwenden. Bis jetzt habe ich immer vor dem Compilieren mittels Text Ersetzen die Header ausgetauscht. Das geht mir jetzt aber langsam auf die Nerven. Leider lässt mir Visual Studio nicht zu dass ich mittels Compiler-Makros diese Haeder umschalte. Also wie mache ich das richtig ohne den kompletten Quellcode zu duplizieren?


von Irgend W. (Firma: egal) (irgendwer)

13.12.2019 16:44




von Bernhard (Gast)

13.12.2019 18:06



Wie ich schon geschrieben habe hatte ich das als Erstes versucht. Leider ergibt folgender Code:

1 #ifdef USE_STDAFX
2 #include "StdAfx.h"
3 #else
4 #include "pch.h"
5 #endif

Folgende Fehlermeldung: *Die Datei "Quelle" kann nicht geöffnet werden: "pch.h". *PCH-Warnung: Das Headerende darf sich nicht in einem Makro oder #if-Block befinden. Es wurde keine IntelliSense-PCH-Datei generiert. Die einzige Lösung währe alle, aber auch wirklich alle Projekte durchzuackern und dort alles von stdafx zu pch umzubenennen. Und dass ist eine Arbeit die ich mir eigentlich ersparen wollte.



Bernhard schrieb: > Also wie mache ich das richtig ohne den kompletten Quellcode zu > duplizieren? Einfache Lösung: Man entscheidet sich für eine Version und deaktiviert in der anderen das "vorkompilierte Header" Feature. Dürfte auf modernen CPUs keine große Rolle spielen, ansonsten hilft ein Ryzen 12-Core ;-) Komplizierte Lösung: Man baut sich die Header jeweils aus Templates beim Build neu passen zum Compiler auf.


von Bernhard (Gast)

14.12.2019 12:36



Mir hat's jetzt gereicht. Ich habe mir gestern Abend ein Programm geschrieben dass mir alle Projekte umbenennen und die Einstellungen anpasst.



warum konfigurierst du die Projekte nicht so um, dass sie beide die gleichen Dateien verwenden. Davon abgesehen würde ich die precompiled header gar nicht in die Sourcen schreiben, sondern per forced include einbinden. dann lässt sich auch leichter checken, ob man seine includes sauber hat und die files auch ohne das pch funktionieren, da dies ja nur zur build-process-optimierung da sein sollte und keine Abhängigkeiten verbergen sollte.


16.12.2019 11:18: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen



Programming/C++

2012. 3. 20. 07:46

C++로 코딩을 할때
먼저 헤더먼저 작성을 하다보면
Error: PCH 경고: 헤더 중지가 매크로 또는 #if 블록에 있으면 안 됩니다. intellisense PCH 파일이 생성되지 않았습니다.

라는 메세지가 나온다..

다른 파일에 메인 함수가 있을시 실행하는데 아무 문제없는 에러이다.
이 에러? (빨간색 밑줄만 그어지고 빌드(컴파일) 시 에러가 나타나지 않는다 )는
선언을 해놓고 안썼다는? 뭐 그런 의미...

헤더 파일 작성후 본 cpp 파일 작성을 할때 해당 헤더파일을 include 하다보면
빨간 밑줄이 사라진다...ㅎ

간만에 아침에 코딩하다 무심코 지나갔던거 적음 ㅎ.


template<typename T> class QSort { static T partition(T* A, int p, int q); static void swap(T& a, T& b); public: static void sort(T* A, int p, int q); }; template<typename T> void QSort<T>::sort(T* A, int p, int q) { T r; if (p < q) { r = partition(A, p, q); sort(A, p, r); sort(A, r + 1, q); } } template<typename T> T QSort<T>::partition(T* A, int p, int q) { T pivot = A[p]; int i = p; for(int j = p + 1; j < q; j++) { if(A[j] <= pivot) { i = i + 1; swap(A[i], A[j]); } } swap(A[i], A[p]); return i; } template<typename T> void QSort<T>::swap(T& a, T& b) { T tmp = a; a = b; b = tmp; }