相关疑难解决方法(0)

C中的宏与函数

我总是看到使用宏比使用函数更好的示例和情况.

有人可以通过一个例子向我解释宏与功能相比的缺点吗?

c function c-preprocessor

93
推荐指数
9
解决办法
8万
查看次数

拒绝指针的数组大小的宏

经常教授的标准数组大小的宏是

#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0]))
Run Code Online (Sandbox Code Playgroud)

或一些等效的形成.然而,当传入指针时,这种事情会默默地成功,并且在运行时看起来似乎有道理,直到事情神秘地分崩离析.

犯这个错误太容易了:一个具有局部数组变量的函数被重构,将一些数组操作移动到一个以数组作为参数调用的新函数中.

所以,问题是:是否有一个"卫生"宏来检测ARRAYSIZEC中宏的滥用,最好是在编译时?在C++中,我们只使用专门用于数组参数的模板; 在C中,似乎我们需要一些方法来区分数组和指针.(例如,如果我想拒绝数组,我只是(arr=arr, ...)因为数组赋值是非法的).

c arrays macros c-preprocessor

49
推荐指数
4
解决办法
1万
查看次数

编译器支持GNU语句表达式

哪些现代编译器支持Gnu语句表达式(C和C++语言).我应该使用什么版本的语句表达式?

语句表达式如下({ code; code; retval }):

int b=56;
int c= ({int a; a=sin(b); a})
Run Code Online (Sandbox Code Playgroud)

我已经知道一些这样的编译器:

这个编译器似乎不支持这个(我不确定):

  • MS Visual C++

PS.这里列出一些C/C++编译器,但我只对成熟编译器感兴趣,这些编译器被广泛使用(例如,不是tcc或turbo c)

c compiler-construction c99 visual-c++

22
推荐指数
1
解决办法
3768
查看次数

不使用宏编译时间sizeof_array

这只是过去几天困扰我的事情,我认为不可能解决,但我之前看过模板魔术.

开始:

为了获得标准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)

c++ puzzle metaprogramming

16
推荐指数
5
解决办法
1万
查看次数

C找到静态数组大小

static char* theFruit[] = {
    "lemon",
    "orange",
    "apple",
    "banana"
};
Run Code Online (Sandbox Code Playgroud)

通过查看这个数组我知道大小是4.如何以编程方式在C中查找此数组的大小?我不希望以字节为单位的大小.

c arrays static

13
推荐指数
1
解决办法
1万
查看次数

澄清整数常量表达式

在某处我读过整数常量表达式包含整数常量,例如:

(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)

c c99

3
推荐指数
1
解决办法
2557
查看次数