Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有符合C99标准的静态断言替换?_C++_C++11_C99_Static Assert - Fatal编程技术网

C++ 是否有符合C99标准的静态断言替换?

C++ 是否有符合C99标准的静态断言替换?,c++,c++11,c99,static-assert,C++,C++11,C99,Static Assert,我一直在尝试实现一种类似于C++11标准中定义的static\u assert的方法。主要问题是C++编译器是如何将被传递到 STATICORACTHOT/的文本消息作为 const char */COD>?我可以让编译器编写一条消息,比如a\u is\u not\u POD。这就是我所拥有的: #define MY_STATIC_ASSERT(condition, name) \ typedef char name[(condition) ? 1 : -1]; 但是,

我一直在尝试实现一种类似于C++11标准中定义的
static\u assert
的方法。主要问题是C++编译器是如何将被传递到<代码> STATICORACTHOT/<代码>的文本消息作为<代码> const char */COD>?我可以让编译器编写一条消息,比如
a\u is\u not\u POD
。这就是我所拥有的:

#define MY_STATIC_ASSERT(condition, name)         \
   typedef char name[(condition) ? 1 : -1]; 

<>但是,编译器可以编写“<代码>”错误:A不是POD。“< /COD>任何建议”< < /P> < P> >在C99编译器中没有“官方”的方式来执行C++编译器中的静态断言。 “主要问题是C++编译器是如何将传递给StasyAsAsTrt的文本消息作为conchchar *?”

C++ > <强>编译器>强>检测代码中的错误,并根据它已知的每个错误所具有的消息的标准列表打印出适当的错误消息。在c99中,编译器不知道什么是“静态断言错误”,因此需要引起一些其他错误

然而,由于使用c99编译器创建静态断言是一种黑客行为,因此它无法准确地按照您的要求打印出一条漂亮的错误消息

以你为例,

#define MY_STATIC_ASSERT(condition, name)         \
    typedef char name[(condition) ? 1 : -1];
MY_STATIC_ASSERT(false, my_error_msg)
将触发
编译器中的
消息“error:size of array'my_error_msg'为负数”
(您希望其他编译器中也会出现类似消息!)。为数组提供
名称的错误消息是打印您自己信息的一种方法。您还可以故意使用各种其他技术/黑客,例如坏模板、枚举


注意:您可以使用
\error
\pragma
预处理器宏在C++11之前提供自定义编译器消息。但是,预处理时间编译时间不同!预处理器对许多表达式和关键字的求值能力有限,如
“if”
“sizeof”
“return”
等,对预处理器来说没有意义,只有编译器才有意义

我不确定我是否理解这个问题,但C11有
\u Static\u assert(条件,errmessage)
。在C99中,该功能缺失,但根据编译器的不同,可以进行模拟。例如,对于gcc(不幸的是,clang不支持属性(错误))


不,那是不可能的。使用较旧的标准,你唯一能得到的就是吐出变量名。“我可以让编译器编写一条消息,就像一个_is_not_POD”如何显示你已经完成了哪些工作来实现这一点?这会让你的问题更清楚。在重新修改之前,FAQ经常说“最好的问题都有一些源代码在里面”,这真是太遗憾了。但是在哪里可以找到静态断言函数的源代码呢?有趣的是编译器如何将字符串写入编译器消息。我一直试图以某种方式使用模板,但到目前为止都没有成功。@Shubham C++11的
static\u assert
不是一个函数-它是一个关键字,就像
for
一样。也没有
的源代码。这就是为什么编译器可以用参数做任何它真正想做的事情。我想这是不可能的,因为Boost的静态断言不能在C++03中打印消息。想必,他们很努力地想找到一条路;如果这在C++03中是不可能的,那么在C99中几乎肯定是不可能的。这真的很好。我不知道我们可以做这样的事!!!很遗憾,clang没有提供此功能。不过会,会四处看看。谢谢!!!
#define MY_STATIC_ASSERT(cnd, descr) ({ \
    extern int __attribute__ ((error("static assert failed: (" #cnd ") (" #descr ")"))) \
               compile_time_check(void); \
    ((cnd) ? 0 : compile_time_check()), 0; \
})