小编vva*_*hev的帖子

C++中extern"C"与extern"C"{}的不同链接

我意识到,乍一看,我的问题似乎与此处与extern关键字相关的众多问题中的一个明显重复,但我无法找到任何答案,讨论extern"C"和extern"C"之间的区别{ }.相反,我发现有几个人说这两个结构是等价的,因为我认为这是合情合理的.不幸的是,经验证据表明它们确实相同.

这是一个例子:

extern "C" { const int my_var1 = 21; }
extern "C" const int my_var2 = 42;
const int my_var3 = 121;

int main() { }
Run Code Online (Sandbox Code Playgroud)

用gcc 7编译后g++ externC.cpp,我看到了一个显着的差异:

$ readelf -s ./a.out | grep my_var
    34: 0000000000000694     4 OBJECT  LOCAL  DEFAULT   15 _ZL7my_var1
    35: 000000000000069c     4 OBJECT  LOCAL  DEFAULT   15 _ZL7my_var3
    59: 0000000000000698     4 OBJECT  GLOBAL DEFAULT   15 my_var2
Run Code Online (Sandbox Code Playgroud)

my_var1并且my_var3都具有本地绑定和C++错位名称,同时my_var2具有 …

c++

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

无法绕过gcc的-Wconversion

int main() {

    struct { unsigned int a:20; } s;
    unsigned int val = 0xaabbc000;

    s.a = val & 0xfffff;         // 1) works
    s.a = (val >> 12) & 0xfffff; // 2) generates -Wconversion warning
}
Run Code Online (Sandbox Code Playgroud)

我正在编译一个项目,-Wconversion我遇到了一个案例,我无法说服编译器我对转换很好.

  • 在案例1中,我使用了在c ++位字段和-Wconversion中提出的相同解决方案,并且它工作得很好.它强制编译器接受转换,因为位掩码限制了值的范围.

  • 但是,在情况2中,由于移位(但为什么?),编译器拒绝接受转换.并以下列方式抱怨:

    $ gcc wconv.c -Wconversion -Werror
    wconv.c: In function ‘main’:
    wconv.c:8:11: error: conversion to ‘unsigned int:20’ from ‘unsigned int’ may alter its value [-Werror=conversion]
     s.a = (val >> 12) & 0xfffff; // 2) generates -Wconversion warning
           ^ …
    Run Code Online (Sandbox Code Playgroud)

c gcc

9
推荐指数
1
解决办法
172
查看次数

强制C编译器生成整数缩小警告

让我们考虑以下示例:

#include <stdio.h>

void func(unsigned char c) {
   printf("0x%x\n", c);
}

int main() {
   int val = 0x11223344;
   func(val);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,有没有办法我可以强制gcc,也没有clang,以示对语句的警告,func(val)对缩小int- > unsigned char会发生在那里.甚至没有编译-Wall -Wextra -pedantic.这个问题主要针对C代码,但也值得C++在讨论中包括世界(见下面的注释).

C++注意

我很清楚C++使用统一初始化语法存在一种解决方法:

func({val});
Run Code Online (Sandbox Code Playgroud)

但是,这并没有解决我的问题,因为:

  • 对于预先存在的代码,它需要更改
  • 对于新代码,它需要{}在任何地方使用

问题1

编译CC++编码时是否有任何神秘的选项可以实现?我很好也与非标准的解决方案,只要它的工作原理gccclang它并没有需要改变的代码.注意:我不是在寻找C++使用包含或不包含原始类型的宏的自定义整数类型的棘手解决方案.我正在寻找像命令行选项或pragma.同样,问题主要是针对C代码,但也值得探索任何C++解决方案.

问题2(后退) …

c compiler-warnings

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

标签 统计

c ×2

c++ ×1

compiler-warnings ×1

gcc ×1