2

私は、教育目的で行っている単純な C コードで、奇妙な振る舞いをしています。

-O2 よりも低い値でコンパイルすると、この出力でリンク編集中に壊れます。

$ make
clang -Wall -march=native -pipe -c -g -D_DEBUG_ main.c
clang -Wall -march=native -pipe -c -g -D_DEBUG_ functions.c
clang -Wall -o main main.o functions.o 
Undefined symbols for architecture x86_64:
  "_getbit", referenced from:
      _getValueFromMatrix in functions.o
  "_setbit", referenced from:
      _populateMatrix in functions.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [main] Error 1

これが役立つかどうかはわかりませんが、setbit(); の実装は次のとおりです。および getbit();

inline void setbit(uint64_t *inteiro, unsigned char pos) {
    *(uint64_t*)inteiro |= (uint64_t)1 << pos;
}

inline bool getbit(uint64_t inteiro, unsigned char pos) {
    return (inteiro & ((uint64_t)1 << pos));
}

編集:

関数.h

#ifndef __FUNCTIONS_H__
#define __FUNCTIONS_H__

/* Funções para manipulação de bits */

inline void setbit(uint64_t *, unsigned char);

inline void clearbit(uint64_t *, unsigned char);

inline bool getbit(uint64_t, unsigned char);

inline unsigned char getbitChar(uint64_t, unsigned char);

char *uint64_t2bin(uint64_t, char *, int);

#endif

main.c にインクルード

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

#include "errors.h"
#include "const.h"
#include "types.h"
#include "functions.h"
4

2 に答える 2

0

インライン関数には外部定義がないため、コンパイラがインライン化に失敗すると ( では実行されません-O0)、リンカーは定義を見つけることができず、エラーが発生します。最も簡単な修正は、に変更inlineすることstatic inlineです。非静的インラインは使いにくく、混乱を招き、通常は役に立ちません。

于 2013-09-22T03:27:38.887 に答える