Tag: function prototypes

将函数指针转换为void会产生什么影响?

所以我想第64次写一个缓冲库,我开始进入一些非常先进的东西。 以为我会就此问一些专业的意见。 在我的第一个头文件中,我有这个: typedef struct StdBuffer { void* address; } StdBuffer; extern void StdBufferClear(StdBuffer); 在#includes第一个头文件的另一个头文件中,我有这个: typedef struct CharBuffer { char* address; } CharBuffer; void (*CharBufferClear)(CharBuffer) = (void*) StdBufferClear; 声明此函数指针void是否会干扰调用? 它们具有值签名匹配。 我以前从未见过一个声明为void的函数指针,但它是让它干净地编译的唯一方法。 Stackwise它不应该与我在汇编编码中学到的东西有任何区别。 毫无意义的 OMG! 我刚才在StackOverflow上说Stackwise! 嗯..看起来我在这里假设太多了。 请允许我重新说明我是否可以。 我不关心地址中存储的“类型”数据。 我所关心的只是一个“单位”的大小以及该地址有多少单位。 如果您愿意,请查看API的接口协议合同: typedef struct StdBuffer { size_t width; ///< The number of bytes that complete a data […]

没有正确的原型调用printf会调用未定义的行为吗?

这个无辜的程序是否会调用未定义的行为: int main(void) { printf(“%d\n”, 1); return 0; }

函数原型和函数实现签名是否可以使用const不一致?

我喜欢在可能的情况下将值参数声明为const ,并且通过搜索SO,我发现这并不太常见 。 像这样: int add(const int a, const int b) { … } 但我想知道: const for values是我的函数的实现细节,而不是它的接口的一部分。 因此将它放入原型似乎是不必要的。 上述函数的原型似乎工作得很好: int add(int a, int b); 然而,我听说过一些问题,例如将main函数的argc声明为const会导致问题: int main(const int argc, const char* const argv[]) 那么这是否意味着int add(int a, int b)和int add(const int a, const int b)毕竟不相同? 如果技术上没问题,我应该做些什么? 我也可以在原型中省略变量名,但我没有,所以也许我不应该省掉const ?

C99中那些奇怪的数组大小和是什么?

显然,以下函数原型在C99和C11中有效: void foo(int a[const *]); void bar(int a[static volatile 10]); 那些奇怪的下标符号* , static和CV限定符的目的是什么? 它们有助于区分静态类型数组和可变长度数组吗? 或者他们只是语法糖?