Mã VC++ của tôi in, trong quá trình biên dịch, giá trị của nhiều hằng số thời gian biên dịch theo ý muốn của bạn (ví dụ: cấu trúc kích thước) và tiếp tục biên dịch mà không có lỗi:
// 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
}
Kết quả mẫu được sản xuất bởi VC++ 2010. Giá trị đích là giá trị tham số mẫu chức năng đầu tiên (0x18 và 0xd8 trong ví dụ) mà VC++ kỳ quặc chọn để xuất dưới dạng giá trị thập lục phân !!
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 ==========
Kỹ thuật chính được sử dụng ở đây là trong mỗi lần thực hiện mẫu hàm, chỉ thị #pragma message()
được gọi một lần. Macro cụ thể của Microsoft __FUNCSIG__
có thể hiển thị chữ ký của hàm chứa và do đó giá trị số nguyên được sử dụng trong mỗi phiên bản cụ thể của mẫu hàm. Đưa ra tham số COUNTER
làm tham số mẫu thứ hai là đảm bảo 2 số nguyên có cùng giá trị vẫn được xem là khác nhau. Số 1 trong chỉ thị #pragma
không được sử dụng ở đây nhưng có thể được sử dụng làm số nhận dạng trong trường hợp chúng tôi có nhiều hơn 1 chỉ thị như vậy và cửa sổ đầu ra đầy các thông điệp lộn xộn.
Xấu hổ đối số tin nhắn của 'static_assert' không thể thực hiện việc này. –
bạn có thể sử dụng chẩn đoán trình biên dịch thông thường bằng cách buộc một kiểu không đầy đủ về lỗi điều kiện, điều này sẽ dẫn đến các đối số mẫu được hiển thị trong đầu ra trình biên dịch, [như ở đây] (http://coliru.stacked-crooked.com/a/ d2a8871788e97987) –
Tôi có thể làm điều này với VC++ (xem câu trả lời của tôi). Có lẽ ai đó có thể thử xem liệu kỹ thuật tương tự có thể được sử dụng trong gcc – JavaMan