Ошибка: неверное количество аргументов указано для атрибута «конструктор» - PullRequest
4 голосов
/ 05 июля 2011

Перед фактической реализацией я написал небольшой прототип кода и поместил конструктор класса и конструктор ctor в один и тот же файл, чтобы посмотреть, будет ли сначала выполняться ctor, что является моей реальной реализацией.

Однако я столкнулся с ошибкой. Вот код:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <iostream>

using namespace std;

extern "C" void startMe(void) __attribute__ ((constructor(1)));
extern "C" void ending(void) __attribute__ ((destructor));

class Test {

 public:

    Test()
    {
      cout << "This is test constructor" << endl;
    }
 };

 int main()
 {
  Test();
  printf("Now main called\n");
 }

 void startMe(void)
 {
  printf("Start me called before main\n");
 }

 void ending(void)
 {
  printf("Destructor called\n");
 }

-

Output:
 $ g++ constructor1.cc 
 constructor1.cc:10: error: wrong number of arguments specified for ‘constructor’ attribute

Однако, когда я удаляю приоритет конструктора, он компилируется и работает нормально. То есть я делаю:

extern "C" void startMe(void) __attribute__ ((constructor)); 

Почему это так? Как отдать приоритет?

Пожалуйста, помогите мне. Моя идея заключается в том, что сначала нужно выполнить «ctor», а затем другой (Test) конструктор. По той же причине я поставил ctor как приоритет 1.

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Компиляция вашей программы как есть:

warning: constructor priorities from 0 to 100 are reserved for the implementation

Изменение приоритета с 1 на 101 избавляет от предупреждения, а исполняемый файл выдает:

 Start me called before main
 This is test constructor
 Now main called
 Destructor called

Это с помощью GCC 4.5

0 голосов
/ 04 сентября 2015

неверное количество аргументов, указанных для атрибута 'конструктор'

Похоже, вы используете версию GCC более низкого уровня.

Согласно GCC 4.2.1документы, ниже приведены соответствующие GCC 4.2.1 Атрибуты функции :

constructor
destructor
Атрибут constructor вызывает автоматический вызов функции до входа в выполнениеmain () ...

И соответствующие Атрибуты функции GCC 4.3.0 :

конструктор
деструктор
конструктор (приоритет)
деструктор (приоритет)
Атрибут конструктор вызывает автоматический вызов функции перед вводом выполнения main () ...

Решение состоит в том, чтобы использовать GCC 4.3 или выше.

В настоящее время я тестирую некоторое программное обеспечение на OpenBSD 5.7, и оно поставляется с компилятором GCC 4.2.1.Мы также поддерживаем CentOS 5, и он поставляется с компилятором GCC 4.1.Вот как выглядит наш код:

// INIT_PRIORITY manages initialization of C++ static objects. Under GCC, 
// the library uses init_priority attribute in the range [INIT_PRIORITY,
// INIT_PRIORITY+100]. Under Windows, INIT_PRIORITY enlists
// "#pragma init_seg(lib)". Undefine or set to 0 to disable it.
#define INIT_PRIORITY 250

#ifdef __GNUC__
# define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#endif
#ifdef __clang__
# define CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
#endif
...

#if __GNUC__ && INIT_PRIORITY && ((GCC_VERSION >= 40300) || (CLANG_VERSION >= 20900))
DLL void API DetectX86Features() __attribute__ ((constructor (INIT_PRIORITY + 50)));
DLL bool API CpuId(word32 input, word32 *output);
#elif __GNUC__ && INIT_PRIORITY
DLL void API DetectX86Features() __attribute__ ((constructor));
DLL bool API CpuId(word32 input, word32 *output);
#else
DLL void API DetectX86Features();
DLL bool API CpuId(word32 input, word32 *output);
#endif

Вы, вероятно, должны создать дополнительный класс, например Initialization, и поместить startMe в конструктор и ending в деструктор.Затем создайте статический экземпляр объекта C ++, например Initialization init;.

Чтобы избежать статического порядка инициализации , фиаско , вы должны использовать init_priority (также см. этот вопрос о переполнении стека и Разъяснение атрибута init_priority в списке рассылки GCC).init_priority существует с , по крайней мере, GCC 3.2 .

...