Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

プリプロセッサを使って少し違うロジックを使い分ける

OSSプロジェクトでは良く見かけるifdef
自前のコードだと余り使わない子ですが、使い所はあります。

種類によって一行だけ違うコードがある場合、ifdefやif defineを使うと楽にいけます。

パターン1:ifdef

対象コード

#include <stdio.h>

int main() {
  printf("yes\n");

  #ifdef COORDINATOR
    printf("###coordinator###\n");
  #endif

  #ifdef ROUTER
    printf("###router###\n");
  #endif

  #ifdef ENDDEVICE
    printf("###enddevice###\n");
  #endif

  return 0;
}

結果

$ gcc ifdeftest.c -D"ENDDEVICE" -o ifdeftest.o
$ ./ifdeftest.o 
yes
###enddevice###

$ gcc ifdeftest.c -D"ROUTER" -o ifdeftest.o
$ ./ifdeftest.o 
yes
###router###

$ gcc ifdeftest.c -D"COORDINATOR" -o ifdeftest.o
$ ./ifdeftest.o 
yes
###coordinator###

パターン2 #if define

if defineを使うと、elseifに相当するelifを使える事から少しスッキリします。

対象コード

#include <stdio.h>

int main() {
  printf("yes\n");

  #if defined COORDINATOR
    printf("###coordinator if###\n");
  #elif defined ROUTER
    printf("###router elif###\n");
  #elif defined ENDDEVICE
    printf("###enddevice elif###\n");
  #endif

  return 0;
}

結果

$ gcc ifelif.c -D"COORDINATOR" -o ifelif.o
$ ./ifelif.o 
yes
###coordinator if###
$ gcc ifelif.c -D"ROUTER" -o ifelif.o                                                                                           
$ ./ifelif.o 
yes
###router elif###
$ gcc ifelif.c -D"ENDDEVICE" -o ifelif.o                                                                                        
$ ./ifelif.o 
yes
###enddevice elif###