下列程序编译是否会报错:

// directive_1.c
#include <stdio.h>

#ifndef MIN
  #define MIN(x, y) ((x) > (y) ? (y) : (x))
#endif /**/x

int main()
{
    printf("min val = %d\n", MIN(100, -1));

    return 0;
}

讲道理程序endif后面有个多余的x应该会编译失败,可是程序编译仅仅有个告警,运行正常。

[root c++]#gcc -g -Wall -o gcc gcc.c
gcc.c:6:12: warning: extra tokens at end of #endif directive [-Wendif-labels]
 #endif /**/x
            ^
[root c++]#./gcc
min val = -1

这和学习cpulimit源码发现的问题如出一辙:

cc -o cpulimit cpulimit.c list.o process_iterator.o process_group.o -Wall -g -D_GNU_SOURCE
cpulimit.c:46:18: warning: extra tokens at end of #ifdef directive
 #ifdef __APPLE__ || __FREEBSD__
                  ^~
make[1]: Leaving directory '/root/cpulimit/src'

原作者这里使用了错误的ifdef,应该使用if defined,详细介绍:

#ifdef 和#if defined区别,#ifdef应该只能有单个条件,如果使用了多个条件gcc编译会有相应告警,而#if defined则可以使用复合条件,类似中的例子:
#if defined(__APPLE__) && defined(__GNUC__)
#  define Q_OS_MACX

ifdef和if defined的区别