2

任何人都知道为什么以下代码在 g++ 4.7.2 下有效?如果我将名称更改printf为另一个名称,例如f,它会出现编译器错误,说 constexpr 不能包含非常量函数调用(我认为这是正确的行为)。

[hidden]$ cat d.cpp 
extern "C" { extern int printf(const char* s, ...); }
constexpr int g() { return printf(""), 0; }
template <int N> struct X { const static int value = N; };
int n = X<g()>::value;
[hidden]$ g++ -std=c++11 -c d.cpp
[hidden]$ g++ -v |& tail -1
gcc version 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC) 

注意我不包含任何头文件。

4

2 回答 2

4

printf()在许多情况下,GCC/g++ 将其作为内置函数处理(尽管我认为这种行为仍然是一个错误)。来自http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

ISO C90 函数 ... printf... 都被识别为内置函数,除非-fno-builtin指定(或-fno-builtin-function为单个函数指定)

如果您使用该-fno-builtin选项,您将获得正确的诊断。

该错误似乎已在 4.8.0 中修复。

于 2013-05-17T21:19:08.543 回答
-1

我认为stdio.h默认包含

我尝试puts并为我工作 [gcc 版本 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)]

extern "C" { extern int puts(const char* s); }
constexpr int g() { return puts(""), 0; }
template <int N> struct X { const static int value = N; };
int n = X<g()>::value;

编辑:

@基思汤普森

在我写“默认包含”之前,我尝试了下面没有#include <stdio.h>. 它编译时带有一些警告但运行 - 所以(出于某种原因)printf, scanf,puts没有#include <stdio.h>. stdio.h默认情况下不包含可能,可能默认链接带有,的printf库。scanfputs

int main()
{
    char one;

    printf("Hello ");
    scanf("%c", &one);
    puts("world!");
}
于 2013-05-17T21:45:42.050 回答