【问题标题】:c11: use _Generic raise SIGSEGVc11:使用 _Generic 提高 SIGSEGV
【发布时间】:2015-11-16 10:54:51
【问题描述】:

这是我的代码,我尝试来自here的示例代码

#include <stdio.h>

#define type_idx(T) _Generic( (T), char: 1, int: 2, long: 3, default: 0)

int main(int argc, char *argv[]) {
    puts(type_idx("smth"));
}

clion 中的输出是:

/home/roroco/.CLion12/system/cmake/generated/c9a7a4c5/c9a7a4c5/Debug/ex/ex
Signal: SIGSEGV (Segmentation fault)

这是我的 CMakeLists.txt

cmake_minimum_required(VERSION 3.3)
project(c)

set(CMAKE_C_COMPILER /usr/bin/gcc-4.9)
set(CMAKE_CXX_COMPILER /usr/bin/g++-4.9)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

【问题讨论】:

    标签: c macros c11


    【解决方案1】:

    字符串文字"smth" 衰减为char* 类型的指针,该指针将被转换为_Generic 的默认子句。你得到的值是 0,所以你的代码相当于

    puts(0);
    

    这没有任何意义,会导致你的程序崩溃。

    【讨论】:

    • const放在那里,这样我就可以问心无愧地投票了。
    • @Bathsheba 但是编辑使答案不正确。 char*(由于从char[N] 转换而来)是正确的类型。
    • 抱歉,我会把它放回去。
    • 编辑了帖子:为了挑剔,文字本身的类型为char [5],然后衰减为指向char的指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2023-03-12
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多