标签: c11

如何在编译时提取没有路径和后缀的源文件名?

同时使用带有-std = c11的gcc和带有-std = c ++ 14的g ++.

例如,对于一个名为src/dir/Hello.cxx它的文件,它应该扩展为例如:

const char basename[] = "Hello";
Run Code Online (Sandbox Code Playgroud)

要么

const char basename[] = getStaticBasename(__FILE__);
Run Code Online (Sandbox Code Playgroud)

如何getStaticBasename()是一个宏(对于C源)或constexpr函数(对于C++源),其结果为"Hello".

我必须避免__FILE__在运行时拆分字符串,因为路径和后缀不能以任何方式编译到可执行文件中.

解决方案必须不依赖于大型库,例如boost.

因为我没有makefile,所以在我的情况下不能使用这样的解决方案.

有人有解决方案吗?

编辑2015-07-02:

  • 我对如何调用编译器和链接器没有影响(有时通过makefile,有时来自命令行,或某些IDE(Eclipse CDT托管make,Crossworks,Xcode等等).所以解决方案只需要代码.
  • 我的用例是为小型日志记录解决方案提供某种"通用区域标识符".应用程序代码(使用我的记录器)应该只#include <Joe/Logger.h>在后面的调用中,例如LOG_DEBUG(...)我将隐含地使用自动生成的"通用区域标识符".
  • 我目前的解决方案是应用程序代码必须在它放入代码之前声明一个JOE_LOG_FILE_REGION(Hello);(之后#include <Joe/Logger.h>)LOG_DEBUG(...).

c c++ c++11 c11 c++14

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

C11类型泛型表达式 - 为什么不只是添加函数重载?

我刚刚阅读了关于C11的维基百科文章,这是2011年12月发布的C标准的新版本,我看到其中一个增加的功能是"类型通用表达式":

使用_Generic关键字的类型泛型表达式.例如,下面的宏CBRT(X)转换为cbrtl(X) ,CBRT(X)cbrtf(X) 取决于类型X:

#define cbrt(X) _Generic((X), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(X)
Run Code Online (Sandbox Code Playgroud)

这看起来非常糟糕 - 如果他们要改变语言,为什么不像C++一样添加函数重载?

c generics overloading c11

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

struct中间的可变长度数组 - 为什么这个C代码对gcc有效

使用VLA(可变长度数组)有一些奇怪的代码,它被gcc 4.6视为有效C(C99,C11):

$ cat a.c
int main(int argc,char**argv)
{
  struct args_t{
     int a;
     int params[argc];        // << Wat?
                        // VLA in the middle of some struct, between other fields
     int b;
  } args;

  args.b=0;

  for(args.a=0;args.a<argc;args.a++)
  {
    args.params[args.a]=argv[0][0];
    args.b++;
  }
  return args.b;
}
Run Code Online (Sandbox Code Playgroud)

此代码编译时没有警告:

$ gcc-4.6 -Wall -std=c99 a.c && echo $?
0
$ ./a.out ; echo $?
1
$ ./a.out 2; echo $?
2
$ ./a.out 2 3; echo $?
3
Run Code Online (Sandbox Code Playgroud)

同样的-std=c1x:

$ gcc-4.6 -Wall -std=c1x a.c && …
Run Code Online (Sandbox Code Playgroud)

c gcc c99 variable-length-array c11

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

int main(){}(没有"void")在ISO C中是否有效且可移植?

C标准main为托管实现指定了两种形式的定义:

int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

int main(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

它可以以与上述"等效"的方式定义(例如,您可以更改参数名称,替换int为定义为int或写char *argv[]为的typedef名称char **argv).

它也可以"以某种其他实现定义的方式"定义 - 这意味着如果实现记录它们,那么它们int main(int argc, char *argv[], char *envp)是有效的.

"以其他一些实施方式定义的方式"条款不在1989/1990标准中; 它是由1999标准添加的(但早期标准允许扩展,因此实现仍然允许其他形式).

我的问题是:鉴于当前(2011)ISO C标准,是表格的定义

int main() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

所有托管实现都有效且可移植?

(请注意,我没有解决C++中的任何一个void main或没有使用 int main()括号的问题.这只是ISO int main(void)int main()ISO 之间的区别.)

c c99 language-lawyer c11

22
推荐指数
3
解决办法
1133
查看次数

__func__外部函数定义

如果我们__func__在C(C99/C11)和C++中的函数外部使用预定义变量会发生什么?

#include <stdio.h>

const char* str = __func__;

int main(void)
{
   printf("%s", str);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc 4.7.2只发出警告(-Wall -W -pedantic启用)并且不打印任何内容.

标准没有明确说明任何事情:

ISO/IEC 14882:2011

8.4.1一般[dcl.fct.def.general]

8函数本地预定义变量__func__定义为static const char __func__[] = "function-name"; 已提供表单定义,其中function-name是实现定义的字符串.未指定此变量的地址是否与程序中任何其他对象的地址不同.

ISO/IEC 9899:2011

6.4.2.2预定义标识符

1标识符__func__应由翻译者隐式声明,如同紧接在每个函数定义的左大括号之后,声明static const char __func__[] = "function-name"; 出现,其中function-name是词法封闭函数的名称.

UB?错误?或者是其他东西?

c c++ c99 c++11 c11

21
推荐指数
2
解决办法
1231
查看次数

C11 alignas与clang -Wcast-align

所以我有以下最小化的C11代码,它定义了一个包含uint16_t的结构(这意味着它应该与2个字节对​​齐的结构)并且我想将一个char缓冲区转换为指向该结构的指针.

随着警告全部上升,clang正确地抱怨结构的对齐要求未得到满足.所以我alignas在缓冲区中添加了一个C11 说明符,以确保缓冲区已经充分对齐,但是没有关闭clang.

我的问题是:我做错了alignas什么?或者只是-Wcast-align诊断只查看参数的类型而不是手动指定的对齐?(我意识到我可以只是为了void*使诊断静音,但由于这段代码应该是可移植的,所以除非我确定它是误报,否则我不想侧面执行诊断.)

#include <stdint.h>
#include <stdalign.h>

struct foo {
    uint16_t field1;
};


int main(void) {
    alignas(struct foo) char buffer[122] = {0};
    struct foo *foo = (struct foo*)buffer;
    return foo->field1;
}
Run Code Online (Sandbox Code Playgroud)

编译器选项和错误消息:

$ clang -ggdb -O3 foo.c -Weverything -Werror -Wno-c++98-compat -Wno-c11-extensions
foo.c:11:23: error: cast from 'char *' to 'struct foo *' increases required alignment from 1 to 2 [-Werror,-Wcast-align]
    struct foo *foo = (struct foo*)buffer;
                      ^~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

编译器版本:

$ clang -v
clang version 3.5.1 …
Run Code Online (Sandbox Code Playgroud)

c clang memory-alignment c11

21
推荐指数
1
解决办法
1745
查看次数

在C1X中初始化匿名结构或联合

我有以下问题:根据当前的C1X草案,匿名结构(或联合)如何正确初始化?这是合法的:

struct foo {
    int a;
    struct {
        int i;
        int j;
    };
    int b;
};

struct foo f = { 1, 2, 3, 4 };
struct foo g = { 1, { 2 }, 3 };
Run Code Online (Sandbox Code Playgroud)

在海湾合作委员会,g.j == 0g.b == 3同时在TCC g.j == 3g.b == 0.目前的草案说:

"[...]结构和联合类型的对象的未命名成员不参与初始化.结构对象的未命名成员即使在初始化之后也具有不确定的值."

这真的可以吗?是不是

struct foo h = { 0 };
Run Code Online (Sandbox Code Playgroud)

应该将所有成员设置为0?

非常感谢!

更新:

由于匿名成员似乎只在混合结构/联合时有用,如何正确初始化它:

struct bar {
    int tag;
    union {
        double …
Run Code Online (Sandbox Code Playgroud)

c standards structure anonymous c11

19
推荐指数
1
解决办法
7864
查看次数

什么是C11中的gets()等价?

来自cplusplus.com

最新版本的C标准(2011年)最终将该功能从其规范中删除

该函数在C++中已弃用(截至2011年标准,遵循C99 + TC3).

我只想知道gets()C11标准的替代方案是什么?

c c11

19
推荐指数
3
解决办法
6117
查看次数

为什么有些C标准头文件以'std'开头,而有些则没有?

例如,在新的C11标准中已添加stdalign.hthreads.h.为什么不stdthreads.halign.h?是否要避免与现有库和系统头冲突?

c c99 c89 c11

19
推荐指数
1
解决办法
324
查看次数

GCC 4.8中的<stdatomic.h>?

我想利用C11标准提供的新原子操作.但是,尝试#include使用适当的头文件可以为我提供:

 csort-par.c:5:23: fatal error: stdatomic.h: No such file or directory
 #include <stdatomic.h>
Run Code Online (Sandbox Code Playgroud)

在文档http://gcc.gnu.org/wiki/C11Status似乎是说,头文件已经提供自GCC 4.7 ...我这么想吗?__STDC_NO_ATOMICS__没有定义.

gcc --version 如下:

gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)

我确认__STDC_NO_ATOMICS__没有定义如下:

#ifdef __STDC_NO_ATOMICS__
#error yes
#else
#error no
#endif
Run Code Online (Sandbox Code Playgroud)

收益率:

csort-par.c:10:2: error: #error no
 #error no
Run Code Online (Sandbox Code Playgroud)

编辑:感谢您的快速回复.

如果有人在谷歌遇到同样的问题而绊倒了这个问题,那么在此期间需要修复,直到他们发布GCC 4.9:

UNIX便携式原子操作

c multithreading gcc atomic c11

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