相关疑难解决方法(0)

为什么GCC在获取void表达式的地址时开始发出警告?

在几个GCC版本之前,我可以做这样的事情:

$ objcopy -I binary -O elf64-x86-64 -B i386 foo.png foo.png.o
Run Code Online (Sandbox Code Playgroud)

...在C中加入以下内容,作为SDL图像加载的示例:

extern void _binary_foo_png_start;
extern void _binary_foo_png_start;
SDL_Surface *image = IMG_Load_RW(SDL_RWFromMem(&_binary_foo_png_start, &_binary_foo_png_end));
Run Code Online (Sandbox Code Playgroud)

然后我将foo.png.o与C文件中的目标文件链接在一起,并获得一个整齐地包含的可执行文件foo.png.

这些天,我仍然可以这样做,但海湾合作委员会警告我:

foo.c:57:19: warning: taking address of expression of type ‘void’
foo.c:57:44: warning: taking address of expression of type ‘void’
Run Code Online (Sandbox Code Playgroud)

显然它仍然有效,据我所知,它确实做到了它应该做的事情.符号本身没有明确定义的类型,因此将它们声明为合适似乎是合适的void.我的意思是,当然,我也可以给他们任何其他任意类型,它仍然可以正常工作,就像我只是想要他们的地址一样,但声明它们void似乎比组成某种类型更好.

那么为什么GCC突然决定开始警告我这个呢?还有其他一些首选的方式吗?

c gcc

10
推荐指数
1
解决办法
1298
查看次数

void变量可以用于什么?

例如,如果我创建变量:

void helloWorld;
Run Code Online (Sandbox Code Playgroud)

我该怎么办?因为它什么都不代表,起初我认为没有什么可以用它做的.我知道函数使用void没有返回值,但变量有用吗?

- 编辑 -

我找到了答案.我现在知道在Java,C++和C等编程语言中,void变量是非法的.感谢您的所有答案!

c c++ java variables void

8
推荐指数
2
解决办法
3987
查看次数

C中的void类型

void在各种不同的情况下,C中的类型似乎很奇怪.有时它的行为类似于普通的对象类型,例如intor char,有时它只是意味着什么(应该如此).

看看我的片段.首先,你可以声明一个void对象似乎很奇怪,这意味着你什么都不宣布.

然后我创建了一个int变量并将其结果转换为void丢弃它:

如果将任何其他类型的表达式计算为void表达式,则会丢弃其值或指示符.(ISO/IEC 9899:201x,6.3.2.2无效)

我试图用void演员调用我的函数,但是我的编译器给了我(Clang 10.0):

error: too many arguments to function call, expected 0, have 1

所以void在原型中没有任何意义,而不是类型void.

但是,然后,我创建了一个指针void,取消引用它,并将" 结果 " 分配给我的int变量.我收到了" 不兼容类型 "错误.这意味着void这里确实存在类型.

extern void a; // Why is this authorised ???

void foo(void); // This function takes no argument. Not the 'void' type.

int main(void)
{
    int a …
Run Code Online (Sandbox Code Playgroud)

c standards void language-lawyer semantics

7
推荐指数
3
解决办法
1394
查看次数

c - 如何断言两种类型在c中相等?

我如何断言 C 中的两种类型相等?在 C++ 中,我会使用 std::is_same,但搜索 StackOverflow 和其他地方似乎只能给出 C++ 和 C# 的结果。有没有办法在 C 中做到这一点?


请注意,这不是询问变量是否具有某种类型,而是询问两种类型是否相同。

c types assert

6
推荐指数
1
解决办法
1375
查看次数

(void)obj和void(obj)之间的区别

根据http://en.cppreference.com/w/cpp/language/explicit_cast,C风格的演员和功能演员是等效的.但是,请参阅以下示例:

#include <array>
int main() {
  std::array<int, 3> arr{};
  (void)arr;
  //void(arr);
}
Run Code Online (Sandbox Code Playgroud)

虽然(void)arr编译,但void(arr)却没有.我错过了什么?

c++ casting void

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

标签 统计

c ×4

void ×3

c++ ×2

assert ×1

casting ×1

gcc ×1

java ×1

language-lawyer ×1

semantics ×1

standards ×1

types ×1

variables ×1