Mein VC++ - Code, der während der Kompilierung den Wert von beliebig vielen Kompilierzeitkonstanten (z. B. sizeof structures) druckt und das Kompilieren ohne Fehler fortsetzt:
// cpptest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//#define VALUE_TO_STRING2(x) #x
//#define VALUE_TO_STRING(x) VALUE_TO_STRING2(x)
#define TO_STRING(x) #x
#define FUNC_TEMPLATE_MSG(x,y) "[" x "]""["TO_STRING(y)"]"
template<unsigned int N,unsigned int M>
int printN()
{
#pragma message(FUNC_TEMPLATE_MSG(__FUNCSIG__ ,1))
return 0;
};
struct X {
char a[20];
int b;
};
struct Y {
char a[210];
int b;
};
int _tmain(int argc, _TCHAR* argv[])
{
printN<sizeof(X),__COUNTER__>();
printN<sizeof(Y),__COUNTER__>();
//..as many compile time constants as you like
}
Beispielausgabe von VC++ 2010 produziert. Der Zielwert ist der erste Funktionsschablonen-Parameterwert (im Beispiel 0x18 und 0xd8), den VC++ als hexadezimalen Wert ausgewählt hat !!
1>------ Build started: Project: cpptest, Configuration: Release Win32 ------
1> cpptest.cpp
1> [int __cdecl printN<0x18,0x0>(void)][1]
1> [int __cdecl printN<0xd8,0x1>(void)][1]
1> Generating code
1> Finished generating code
1> cpptest.vcxproj -> c:\work\cpptest\Release\cpptest.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Die Haupttechnik hier verwendet wird, ist, dass ein während jeder Funktion Vorlage Instanziierung, die #pragma message()
Richtlinien einmal aufgerufen werden. Das Microsoft-spezifische Makro __FUNCSIG__
kann die Signatur der enthaltenden Funktion und damit den Integer-Wert anzeigen, der bei jeder spezifischen Instanziierung der Funktionsvorlage verwendet wird. Geben Sie als zweiten Vorlagenparameter COUNTER
ein, um sicherzustellen, dass 2 Ganzzahlen mit demselben Wert immer noch als unterschiedlich betrachtet werden. Die 1 in der #pragma
Direktive ist hier nicht von Nutzen, kann aber als Identifikator verwendet werden, falls wir mehr als 1 solcher Direktive haben und das Ausgabefenster voller unordentlicher Nachrichten ist.
Shame 'static_assert's Nachrichtenargument kann dies nicht tun. –
können Sie die normale Compilerdiagnose verwenden, indem Sie einen unvollständigen Typ bei fehlgeschlagenem Zustand erzwingen, was dazu führen sollte, dass Template-Argumente in der Compilerausgabe sichtbar sind [wie hier] (http://coliru.stacked-crooked.com/a/ d2a8871788e97987) –
Ich kann dies mit VC++ tun (siehe meine Antwort). Vielleicht könnte jemand versuchen zu sehen, ob die gleiche Technik in GCC verwendet werden kann – JavaMan