我总是看到使用宏比使用函数更好的示例和情况.
有人可以通过一个例子向我解释宏与功能相比的缺点吗?
经常教授的标准数组大小的宏是
#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0]))
Run Code Online (Sandbox Code Playgroud)
或一些等效的形成.然而,当传入指针时,这种事情会默默地成功,并且在运行时看起来似乎有道理,直到事情神秘地分崩离析.
犯这个错误太容易了:一个具有局部数组变量的函数被重构,将一些数组操作移动到一个以数组作为参数调用的新函数中.
所以,问题是:是否有一个"卫生"宏来检测ARRAYSIZEC中宏的滥用,最好是在编译时?在C++中,我们只使用专门用于数组参数的模板; 在C中,似乎我们需要一些方法来区分数组和指针.(例如,如果我想拒绝数组,我只是(arr=arr, ...)因为数组赋值是非法的).
哪些现代编译器支持Gnu语句表达式(C和C++语言).我应该使用什么版本的语句表达式?
语句表达式如下({ code; code; retval }):
int b=56;
int c= ({int a; a=sin(b); a})
Run Code Online (Sandbox Code Playgroud)
我已经知道一些这样的编译器:
这个编译器似乎不支持这个(我不确定):
PS.这里列出了一些C/C++编译器,但我只对成熟编译器感兴趣,这些编译器被广泛使用(例如,不是tcc或turbo c)
这只是过去几天困扰我的事情,我认为不可能解决,但我之前看过模板魔术.
开始:
为了获得标准C++数组中的元素数量,我可以使用宏(1)或类型安全的内联函数(2):
(1)
#define sizeof_array(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))
Run Code Online (Sandbox Code Playgroud)
(2)
template <typename T>
size_t sizeof_array(const T& ARRAY){
return (sizeof(ARRAY)/sizeof(ARRAY[0]));
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,第一个问题是成为一个宏(目前我认为是一个问题),而另一个问题是在编译时无法获得数组的大小; 即我不能写:
enum ENUM{N=sizeof_array(ARRAY)};
Run Code Online (Sandbox Code Playgroud)
要么
BOOST_STATIC_ASSERT(sizeof_array(ARRAY)==10);// Assuming the size 10..
Run Code Online (Sandbox Code Playgroud)
有谁知道这是否可以解决?
更新:
这个问题是在引入constexpr之前创建的.现在你可以简单地使用:
template <typename T>
constexpr auto sizeof_array(const T& iarray) {
return (sizeof(iarray) / sizeof(iarray[0]));
}
Run Code Online (Sandbox Code Playgroud) static char* theFruit[] = {
"lemon",
"orange",
"apple",
"banana"
};
Run Code Online (Sandbox Code Playgroud)
通过查看这个数组我知道大小是4.如何以编程方式在C中查找此数组的大小?我不希望以字节为单位的大小.
在某处我读过整数常量表达式包含整数常量,例如:
(5 + 5) //integer constant expression
Run Code Online (Sandbox Code Playgroud)
这是我见过的唯一例子.
现在,从标准说:
(C99 6.6/6)整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,以及作为强制转换的直接操作数的浮点常量.整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof运算符的操作数的一部分.
那么,如果我是对的,下面是所有这些整数表达式吗?
int i; float f = 3.14f;
i = 42;
i = f;
i = (int)(5/3.14f);
Run Code Online (Sandbox Code Playgroud)